使用Python的Denoise图像算法

时间:2014-10-29 22:41:48

标签: python algorithm python-imaging-library

我试图写一个"去噪"照片。我试图仅抓取非边界像素并使用边界像素来设置它的值,但似乎我的算法没有抓住预期的像素(我得到一个搞砸的图像结果是)。如果我理解正确n =长度,m =高度(例如行)。我知道我可以使用numpy来获得3D表示,但这并不是我想要做的事情。谁能看到我做错了什么?这是代码:

from PIL import Image
def DenoiseImage(inputIm, factor, iters):

data = list(inputIm.getdata())
n, m = inputIm.size
data2 = data

for y in range (0, iters):

    #operate on pixels that aren't part of the top or bottom row
    for x in range (n, ((m-1)*n)-1):

        #makes sure x operated on isn't part of the left or right border
        if (x-1)%n != 0 and x%n != 0:
            #denoise pixel
            data[x] = data2[x] +factor*(data2[x-1]+data2[x+1]-4*data[x]+data2[x-n]+data2[x+n])

    temp = data2
    data2 = data
    data = temp

if iters%2==0:
    return data2
else:
    return data

这是我尝试使用的算法(但它是为二维表示(和C语言)编写的,显然):http://pastebin.com/teEeUgFj

编辑:有点想象算法背后的想法,带来我所有的艺术天赋:

derp

请记住m是向下的长度,所以在图片中m将是= 4,而不是301.

2 个答案:

答案 0 :(得分:1)

可能的原因可能是data2 = data。更改数据的过程将导致data2中的相同更改,这意味着它们共享相同的内存块。当你处理一些可变类如list时,这将在python中独一无二地发生。你可以用

import copy data2 = copy.copy(data)

或者我建议您使用scipy.signal.convolve2d来简化代码,并且效率会更高。查看here

答案 1 :(得分:1)

对于 python3 简单地做

data2 = data.copy()