CV|图像叠加噪声

1.6k words

mark一下图像加各类噪声的实现~~

参考链接:用Python实现图像噪声、去噪基本方法 - 知乎 (zhihu.com)

1.高斯噪声

概率密度公式:

生成的噪声情况:

噪声叠加:

代码:

1
2
3
4
5
6
#高斯噪声
img = cv2.imread("dog.jpg")
# 产生高斯随机数
noise = np.random.normal(0,50,size=img.size).reshape(img.shape[0],img.shape[1],img.shape[2])
cv2.imshow('image',noise)
cv2.waitKey(0)

np.random.normal(loc=0.0, scale=1.0, size=None)

参数:

loc(float):此概率分布的均值(对应着整个分布的中心centre)

scale(float):此概率分布的标准差(对应于分布的宽度,scale越大,图形越矮胖;scale越小,图形越瘦高) size(int or tuple of ints):输出的shape,默认为None,只输出一个值 通过以上参数解释可知:np.random.normal(loc=0, scale=1, size)就表示标准正太分布(μ=0, σ=1)。

2.高斯滤波

高斯滤波是一种线性平滑滤波,一般用于消除高斯噪声。对于每一个像素点的值,是由其本身和邻域内的其他像素值经过加权平均后得到。

二维高斯函数:

1
2
3
4
5
6
#高斯滤波--用于减缓高斯噪声
noised = cv2.imread("noised.png")
clean_noised = cv2.GaussianBlur(noised,(55,55),0)
cv2.imshow('image',clean_noised)
cv2.waitKey(0)
cv2.imwrite("clean_noised.png",clean_noised)

懒得打字,放截图了

参数调大了效果还不错,看不到那些花花绿绿的点了

就是有一种近视了的美感

3.泊松噪声

简言之就是符合泊松分布的噪声模型,又称散粒噪声。

lamda设置为100:

lamda越大,噪声程度越深

1
2
3
4
#泊松噪声
noise = np.random.poisson(lam=150,size=shape).astype('uint8')
cv2.imshow('image',noise)
cv2.waitKey(0)

4.椒盐噪声

椒盐噪声又称为脉冲噪声,是在图像上随机出现黑色白色的像素,顾名思义就是椒盐噪声 = 椒噪声(值为0,黑色) + 盐噪声(值为255,白色)。SNR越小,噪声越大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#生成一张黑底的图片用来看噪声点分布
noise = np.zeros(shape)
noised = img.copy()
# 转化成向量
noised = noised.reshape(1,-1)
noise = noise.reshape(1,-1)
print(noised.shape)

# 设置信噪比
SNR = 0.85
# 得到要加噪的像素数目
noise_num = noised.size * (1-SNR)
# 得到需要加噪的像素值的位置
list = random.sample(range(0,noised.size),int(noise_num))

for i in list:
if random.random() >= 0.5:
noised[0][i] = 0
noise[0][i] = 0
else:
noised[0][i] = 255
noise[0][i] = 255
noised = noised.reshape(img.shape)
noise = noise.reshape(img.shape)

# cv2.imshow('salt&pepper noise',img1)
# cv2.waitKey(0)
cv2.imwrite("noised.png",noised)
cv2.imshow("noise",noise)
cv2.waitKey(0)oise",noise)
cv2.waitKey(0)

只看参考链接中对椒盐噪声的定义,好像不应该是像代码的这个写法,然后自己写了个直接改像素的,随机选中像素点改成黑白的,且称之为补丁吧

5.补丁

黑白补丁

为了方便看黑白,底色设置成了红色,但是白色还是不明显。。。。

预测结果:850

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#黑白补丁
noised = img.copy()
#生成一张红底的图片用来看噪声点分布
noise = np.zeros(shape)
noise[:,:,0] = 0
noise[:,:,1] = 0
noise[:,:,2] = 255
# 设置补丁比例
r = 0.25
noise_num = shape[0]* shape[1] * r #修改的像素数 #shape是(h,w,c)!!!不是(c,h,w)!!
# 得到需要加噪的像素值的位置
list = random.sample(range(0,shape[0]* shape[1]),int(noise_num))
for i in list:
x = i//shape[1]
y = i%shape[1]
if random.random() >= 0.5:
noise[x,y,:] = 0
noised[x,y,:] = 0
else:
noise[x,y,:] = 255
noised[x,y,:] = 255
cv2.imwrite("noised.png",noised)
cv2.imshow("noise",noise)
cv2.waitKey(0)

纯补丁:

预测结果267

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#纯补丁
noised = img.copy()
#黑底
noise = np.zeros(shape)
noise[:,:,0] = 0
noise[:,:,1] = 0
noise[:,:,2] = 0
# 设置补丁比例
r = 0.25
noise_num = shape[0]* shape[1] * r #修改的像素数 #shape是(h,w,c)!!!不是(c,h,w)!!
# 得到需要加噪的像素值的位置
list = random.sample(range(0,shape[0]* shape[1]),int(noise_num))
for i in list:
x = i//shape[1]
y = i%shape[1]
noise[x,y,:] = 255
noised[x,y,:] = 255
cv2.imwrite("noised.png",noised)
cv2.imshow("noise",noise)
cv2.waitKey(0)

6.瑞利噪声

一般是由由信道不理想引起的,它与信号的关系是相乘,信号在它在,信号不在他也就不在。

瑞利密度对倾斜形状直方图的建模非常有用。

看不太懂这个噪声,不知道为什么出来是白色的,看了下生成噪声,最小值是0,最大值是300多

1
2
3
4
5
# 瑞利噪声
sigma = 70.0
noise = np.random.rayleigh(sigma, size=img.shape)
cv2.imshow("noise",noise)
cv2.waitKey(0)

1
2
3
4
5
# 瑞利版本2
noised = img.copy()
noised = np.random.rayleigh(noised, size=img.shape)
cv2.imshow("noised",noised)
cv2.waitKey(0)

7.爱尔兰(伽马)噪声

这个噪声也是偏大的,叠完就很白了

1
2
3
4
#爱尔兰(伽马)噪声
noise = np.random.gamma(shape=10.0,scale=10.0,size=img.shape)
cv2.imshow("noise",noise)
cv2.waitKey(0)

8.均匀噪声

设置了50-100,纯噪声看上去是纯白色的

有一种均匀地过曝的感觉

1
2
3
4
#均匀噪声
noise = np.random.uniform(0,50,img.shape)
cv2.imshow("noise",noise)
cv2.waitKey(0)

调了一下参数,把50,100,改成0到50,不然就是曝光的感觉

变化不大

图像加噪后resnet50预测结果

影响不大,补丁的影响是最明显的

高斯 泊松 补丁 纯白补丁 椒盐噪声 瑞利噪声 爱尔兰噪声 均匀噪声
噪声参数设置 均值=0;方差=50 lamda=20 更改像素值=25% 更改像素值=25% 信噪比=85% 即更改像素值=25% sigma=70 shape=10.0,scale=10.0 (a,b)=(50,100)
标签 207 207 850 266 207 207 207 207