import cv2
import numpy as np
src=cv2.imread('lena.jpg')
def saltpepper_noise(image,proportion):
image_copy=image.copy()
img_y, img_x=image.shape[0:2]
x=np.random.randint(img_x,size=(int(proportion*img_x*img_y),))
y=np.random.randint(img_y,size=(int(proportion*img_x*img_y),))
image_copy[y,x]=np.random.choice([0,255],size=(int(proportion*img_x*img_y),1))
sp_noise_plate=np.ones_like(image_copy)*127
sp_noise_plate[y,x]=image_copy[y,x]
return image_copy,sp_noise_plate
def gaussian_noise(image,mean,sigma):
image=image/255
noise=np.random.normal(mean,sigma,image.shape)
gaussian_out=image+noise
gaussian_out=np.clip(gaussian_out,0,1)
gaussian_out=np.uint8(gaussian_out*255)
noise=np.uint8(noise*255)
return gaussian_out,noise
def average_filter(image,kernel_size):
image_copy=image.copy()
kernel=np.ones((kernel_size,kernel_size),int)
print(kernel)
image_y,image_x=image.shape[0:2]
image_copy=cv2.copyMakeBorder(image_copy,1,1,1,1,cv2.BORDER_CONSTANT)
image=image_copy.copy()
for x in range(1,image_x):
for y in range(1,image_y):
image_child=image[x-1:x+2,y-1:y+2,1]
list_average=kernel*image_child
image_copy[x,y]=abs(list_average.sum()/(np.square(kernel_size)))
return image_copy
image_copy,sp_noise_plate=saltpepper_noise(src,0.04)
image_gaussian,noise_gaussian=gaussian_noise(src,0,0.03)
dst_blur=cv2.blur(image_copy,(3,3))
dst_filtered=average_filter(image_copy,3)
cv2.imshow('src',src)
cv2.imshow('dst_sp',image_copy)
cv2.imshow('dst_gaussian',image_gaussian)
#cv2.imshow('dst_blur',dst_blur)
cv2.imshow('dst_filtered',dst_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图
椒盐噪声
高斯噪声
均值滤波