我尝试实现以下算法,但生成的图像看起来相同。

第1步:读取嘈杂的图像。

第2步:选择尺寸为3x3的2D窗口,中心元素为
处理像素。假设像素为
已处理为P
ij


步骤3:如果P
ij
是未损坏的像素(即0 ij
其值保持不变。

步骤4:如果P
ij
= 0或P
ij
= 255,然后是P
ij
是损坏的像素。

步骤5:如果是3/4

或所选窗口中的更多像素嘈杂
然后将窗口大小增加到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")

最佳答案

您应该使用median filter,它易于实现,并且对于盐和胡椒粉的噪声效果很好。

07-28 07:26