2014-10-29 147 views
0

我正在尝试编写一个“降噪”图片的程序。我试图抓取非边界像素,并使用边界像素来设置它的值,但似乎我的算法没有抓住预期的像素(因此我得到了一个搞砸的图像)。如果我理解正确,n =长度,m =高度(例如行)。我知道我可以使用numpy来获得3D表示,但这不是我想要做的。任何人都可以看到我做错了什么?下面的代码:使用Python的降噪图像算法

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 

这是我想要使用的算法(但它是一个2D-表示写(和C),很明显):http://pastebin.com/teEeUgFj

编辑:还挺的算法背后的想法图形表示,把我所有的艺术人才来承担:

derp

记住m是长度向下,所以在画面M.将be = 4,而不是301.

回答

1

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

import copy data2 = copy.copy(data)

或者我建议你使用scipy.signal.convolve2d来简化你的代码,同时也将更加高效。检查here

+0

谢谢,这绝对是一个问题。现在我得到的输出图片不是90%的黑盒子。但我仍然有一个问题:如果我做1次迭代,输出图片或多或少是相同的(这可能是有意的),但是如果我做了很多迭代(例如10次),那么输出的图片只是一场“暴风雪”。我没有替换data2 =数据,和临时使用,与副本的东西。想法?看起来核心的降噪功能无法正常工作,但据我所知,我几乎可以直接从我发布链接的算法中复制它。 – user2875994 2014-10-30 08:39:13

+0

另外,convoke2d似乎将2d数组作为输入,而我得到的列表是1维列表。 – user2875994 2014-10-30 08:43:29

+0

Ooop,没关系,我只是有太高的因子值(1),当我用0.1尝试时,我得到了一个工作输出图片。所以我猜想唯一相关的问题是convoke。 – user2875994 2014-10-30 08:46:30