我正在尝试编写一个“去噪”图片的程序。我试图只抓取非边界像素并使用边界像素来设置它的值,但似乎我的算法没有抓取预期的像素(结果我得到了一个搞砸的图像)。如果我理解正确 n=length,m=height(例如行)。我知道我可以使用 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
编辑:有点像算法背后思想的图形表示,发挥了我所有的艺术才能:
请记住 m 是向下的长度,所以图中 m = 4,而不是 301。
最佳答案
造成这种情况的可能原因可能是data2 = data
。您更改数据的过程将导致 data2 发生相同的更改,这意味着它们共享同一 block 内存。当您处理一些可变类(例如列表)时,这将在 python 中独一无二地发生。你可以使用
导入副本
data2 = copy.copy(数据)
或者我建议你使用 scipy.signal.convolve2d 来简化你的代码,而且效率也会更高。检查here
关于python - 使用Python去噪图像算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26641909/