如何使用Python从图像中清除盐和胡椒噪声



我试图实现以下算法,但是结果图像看起来相同。

步骤1 :阅读嘈杂的图像。

步骤2 :选择中心元素大小3x3的2D窗口处理像素。假设像素是处理的是pIJ。

步骤3 :如果PIJ是一个未腐烂的像素(即0< pIJ< 255),然后它的值保持不变。

步骤4 :如果PIJ= 0或pIJ= 255,然后pIJ是一个损坏的像素。

步骤5 :如果3/4Th或选定窗口中的更多像素嘈杂然后将窗口尺寸增加到5x5。步骤6:如果所选窗口中的所有元素为0,并且255,然后更换PIJ与元素的平均值在窗口中,否则转到步骤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")   

您应该使用中位过滤器,在盐和胡椒噪声方面易于实现,工作非常好。

正如奥利维尔(Olivier)所建议的那样,中值过滤器提供了最佳结果。

这是我生成的代码,用于将盐和胡椒噪声添加到图像中。该代码适用于python,带有OpenCV 3.0.0:

import numpy as np
import cv2
img = cv2.imread('3.jpg', 1)
row,col,ch = img.shape
p = 0.5
a = 0.009
noisy = img
  # Salt mode
num_salt = np.ceil(a * img.size * p)
coords = [np.random.randint(0, i - 1, int(num_salt))
          for i in img.shape]
noisy[coords] = 1
  # Pepper mode
num_pepper = np.ceil(a * img.size * (1. - p))
coords = [np.random.randint(0, i - 1, int(num_pepper))
          for i in img.shape]
noisy[coords] = 0
cv2.imshow('noisy', noisy)

这是使用中间过滤器的代码:

median_blur= cv2.medianBlur(noisy, 3)
cv2.imshow('median_blur', median_blur)  
cv2.waitKey()
cv2.destroyAllWindows()

可以根据要求对嘈杂图像进行模糊的窗口。

您的输入图像是什么样的?您的算法假设只有像素值0和255是噪声。如果您的嘈杂像素实际上具有除此之外的其他值,那么您的算法不会做任何事情,并且您可能会看到输出看起来与输入相同。

最新更新