前言
这篇文章是为了后面那篇模糊处理做准备的,我们自己弄一些噪声加在图片上,然后用模糊来观测去除的效果。
正文
介绍
(1) 椒盐噪声
椒盐噪声也称脉冲噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。
图像模拟添加椒盐噪声是通过:随机获取像素点,并设置为高亮度点和低亮度点来实现的。
(2) 高斯噪声
高斯噪声是指概率密度函数服从高斯分布的一类噪声。
特别的,如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度服从均匀分布,则称这个噪声为高斯白噪声。
高斯白噪声 功率谱密度频谱图 和 噪声幅值分布图的图片如下:
代码
效果图
code
import cv2 as cv
import numpy as np
# 将rgb颜色通道的图像转为灰色
def rgb2gray(img):
h=img.shape[0]
w=img.shape[1]
img1=np.zeros((h,w),np.uint8)
for i in range(h):
for j in range(w):
# 变成灰色的公式
img1[i,j]=0.144*img[i,j,0]+0.587*img[i,j,1]+0.299*img[i,j,2]
return img1
# 添加噪声
def sp_noise(img,snr):
h=img.shape[0]
w=img.shape[1]
img1=img.copy()
sp=h*w # 计算图像像素点个数
NP=int(sp*(1-snr)) # 计算图像椒盐噪声点个数
for i in range (NP):
randx=np.random.randint(1,h-1) # 生成一个 1 至 h-1 之间的随机整数
randy=np.random.randint(1,w-1) # 生成一个 1 至 w-1 之间的随机整数
if np.random.random()<=0.5: # np.random.random()生成一个 0 至 1 之间的浮点数
img1[randx,randy]=0
else:
img1[randx,randy]=255
return img1
# 添加高斯噪声
def gasuss_noise(image, mean=0, var=0.001):
'''
添加高斯噪声
mean : 均值
var : 方差
'''
image = np.array(image/255, dtype=float)
noise = np.random.normal(mean, var ** 0.5, image.shape)
out = image + noise
if out.min() < 0:
low_clip = -1.
else:
low_clip = 0.
out = np.clip(out, low_clip, 1.0)
out = np.uint8(out*255)
#cv.imshow("gasuss", out)
return out
image=cv.imread("../../images/lena.jpg")
grayimage=rgb2gray(image)
sp_noiseimage=sp_noise(grayimage,0.98) # 将信噪比设定为0.98
# cv2.GaussianBlur(grayimage, ksize=(9, 9), sigmaX=0, sigmaY=0) 这段代码也是可以添加高斯噪声的,更方便,但是不符合实验的初衷
gasuss_noiseimage=gasuss_noise(grayimage,0,0.02) # 将信噪比设定为0.98,就是将噪声的比例设置为0.02
cv.imshow("image",image)
cv.imshow("grayimage",grayimage)
cv.imshow("sp_noiseimage",sp_noiseimage)
cv.imshow("gasuss_noiseimage",gasuss_noiseimage)
cv.imwrite('grayimage.jpg',grayimage)
cv.imwrite('sp_noiseimage.jpg',sp_noiseimage)
cv.imwrite('gasuss_noiseimage.jpg',gasuss_noiseimage)
cv.waitKey(0)
cv.destroyAllWindows()
在这里面,我也用imwrite写入文件夹之中了。让图片后续可用。