如何使用python从图像中去除盐和胡椒的噪音?
我试图实现以下算法,但生成的图像看起来相同。
第1步 :读取噪声图像。
步骤2 :选择以中心元素作为处理像素的尺寸为3×3的2D窗口。 假设正在处理的像素是P ij。
步骤3 :如果P ij是未损坏的像素(即,0 <P ij <255),则其值保持不变。
步骤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")
你应该使用中值滤波器,它很容易实现,并且对于盐和胡椒噪声工作得非常好。
你的输入图像是什么样的? 您的算法只假定像素值0和255是噪声。 如果您的噪点像素实际上具有其他值,那么您的算法将不会执行任何操作,并且您可能会看到输出看起来与输入相同。
正如Olivier所建议的那样,中值滤波器提供了最好的结果。
下面是我为将盐和胡椒噪声添加到图像中而生成的代码。 代码是用于OpenCV 3.0.0的python:
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()
用于模糊噪声图像的窗口可根据需要进行修改。
链接地址: http://www.djcxy.com/p/79607.html上一篇: how to remove salt and pepper noise from images using python?