【发布时间】:2014-04-11 11:36:08
【问题描述】:
我已尝试实现以下算法,但生成的图像看起来相同。
第 1 步:读取噪声图像。
第 2 步:选择大小为 3x3 的 2D 窗口,中心元素为 处理像素。假设像素为 处理的是P ij .
第 3 步:如果 P ij 是一个未损坏的像素(即 0
第 4 步:如果 P ij = 0 或 P ij = 255,然后 P ij 是损坏的像素。
第 5 步:如果 3/4 th 所选窗口中的像素或更多像素有噪点 然后将窗口大小增加到 5x5。 步骤 6:如果所选窗口中的所有元素都是 0,并且 255的,然后替换P ij 与元素的平均值 在窗口中,否则转到第 7 步。
第 7 步:从所选窗口中消除 0 和 255 并找到剩余元素的中值。 替换 Pij 中值。
第 8 步:重复第 2 步到第 6 步,直到整个像素 图像已处理。
这是我的代码。请提出改进建议。
import Image
im=Image.open("no.jpg")
im = im.convert('L')
for i in range(2,im.size[0]-2):
for j in range(2,im.size[1]-2):
b=[]
if im.getpixel((i,j))>0 and im.getpixel((i,j))<255:
pass
elif im.getpixel((i,j))==0 or im.getpixel((i,j))==255:
c=0
for p in range(i-1,i+2):
for q in range(j-1,j+2):
if im.getpixel((p,q))==0 or im.getpixel((p,q))==255:
c=c+1
if c>6:
c=0
for p in range(i-2,i+3):
for q in range(j-2,j+3):
b.append(im.getpixel((p,q)))
if im.getpixel((p,q))==0 or im.getpixel((p,q))==255:
c=c+1
if c==25:
a=sum(b)/25
print a
im.putpixel((i,j),a)
else:
p=[]
for t in b:
if t not in (0,255):
p.append(t)
p.sort()
im.putpixel((i,j),p[len(p)/2])
else:
b1=[]
for p in range(i-1,i+2):
for q in range(j-1,j+2):
b1.append(im.getpixel((p,q)))
im.putpixel((i,j),sum(b1)/9)
im.save("nonoise.jpg")
【问题讨论】:
-
您是如何确定这两个图像相同的。目视检查或图像差异?除了几个像素外,它们可能看起来很相似。查看代码的一个问题是,无论像素是 0 还是 255,您都将附加到临时数组(b 和 b1)。如果您只想要有效像素的中位数,则需要在您之前进行额外的测试附加。其次,您正在计算平均值,而不是中位数 (numpy.median)
标签: python image image-processing noise noise-reduction