- 1、高斯噪声
- 2、均匀分布噪声
- 3、脉冲噪声(椒盐噪声)
- 4、Python实现
1、高斯噪声
高斯噪声的概率密度函数
z表示灰度值
μ表示z的平均值或期望值
σ表示z的标准差
σ²表示z的方差高斯噪声的概率密度图像
当z服从上式高斯分布时,其值有70%落在[(μ-σ), (μ+σ)]范围内,有95%落在[(μ-2σ), (μ+2σ)]范围内。
2、均匀分布噪声
均匀分布噪声的概率密度函数
概率密度函数的期望值 μ=(a+b)/2
概率密度函数的方差 σ²=(b-a)²/12均匀分布噪声的概率密度图像
3、脉冲噪声(椒盐噪声)
椒盐噪声的概率密度函数
椒盐噪声的概率密度图像
- 如果b>a,灰度值b在图像中将显示为一个亮点,灰度值a在图像中呈现为一个暗点
- 如果Pa或Pb为零,则脉冲噪声称为单极脉冲
- 如果Pa=0,则图像中没有暗点,只有亮点噪声,称为盐粒噪声(正脉冲);如果Pb=0,则图像中只有暗点,此时称为胡椒噪声(负脉冲)
4、Python实现
np.clip(a, a_min, a_max, out=None)
作用:将数组a中的所有数限定到范围a_min和a_max中
参数解释
a:输入矩阵
a_min:被限定的最小值,所有比a_min小的数都会强制变为a_min
a_max:被限定的最大值,所有比a_max大的数都会强制变为a_max
out:可以指定输出矩阵的对象,shape与a相同
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,只输出一个值
import cv2
import numpy as np
import matplotlib.pyplot as plt
import random
# 高斯噪声
def gaussian_noise(img, miu, sigma):
"""
img: 原图
miu: μ
sigma: σ
gaussianImg: 噪声处理后的图像
noise: 噪声图像
"""
# 将图片灰度标准化
img = np.array(img/255, dtype=float)
# 产生高斯噪声图像
noise = np.random.normal(miu, sigma, img.shape)
# 将源图像与噪声叠加
gaussianImg = img + noise
# 小于0的值设置为0 大于255的值设置为255
gaussianImg = np.clip(gaussianImg, 0, 1)
# 将图像灰度范围恢复为0-255
gaussianImg = np.uint8(gaussianImg * 255)
return gaussianImg
# 椒盐噪声
def saltAndPepper_noise(img, prob):
"""
img: 原图像
prob: 噪声比例
spImg: 噪声处理后的图像
"""
spImg = np.zeros(img.shape, np.uint8)
thres = 1 - prob
for i in range(img.shape[0]):
for j in range(img.shape[1]):
rNum = random.random() # 随机生成0-1之间的数字
# 如果生成的随机数小于噪声比例则将该像素点添加黑点,即椒噪声
if rNum < prob:
spImg[i][j] = 0
# 如果生成的随机数大于(1-噪声比例)则将该像素点添加白点,即盐噪声
elif rNum > thres:
spImg[i][j] = 255
# 其他情况像素点不变
else:
spImg[i][j] = img[i][j]
return spImg
img = cv2.imread('D:/Study/digital image processing/test/Cameraman.bmp')
res1 = gaussian_noise(img, 0.1, 0.1)
res2 = saltAndPepper_noise(img, 0.06)
plt.subplot(131), plt.imshow(img), plt.title('Input')
plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(res1), plt.title('gaussianImg')
plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(res2), plt.title('spImg')
plt.xticks([]), plt.yticks([])
plt.show()