目录
一、图像噪声
图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理的信号。
图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到了噪声的污染。
1、高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布的一类噪声。
如果一个噪声,它的幅度分布服从高斯分布,而它的任意两个采样样本之间不相关,则称它为高斯白噪声。
必须区分高斯噪声和白噪声两个不同的概念。
高斯噪声是指噪声的概率密度函数服从高斯分布,白噪声是指噪声的任意两个采样样本之间不相关,两者描述的角度不同。
白噪声不必服从高斯分布,高斯分布的噪声不一定是白噪声。
高斯分布
产生原因
- 图像传感器在拍摄时不够明亮、亮度不够均匀。
- 电路各元器件自身噪声和相互影响。
- 图像传感器长期工作,温度过高。
一个正常的高斯采样分布公式,得到输出像素 Pout。
Pout(输出像素) = Pin(输入像素) + random.gauss(符合高斯分布的随机数)
其中 random.gauss 是通过 sigma 和 mean 来生成符合高斯分布的随机数。
给一副数字图像加上高斯噪声的处理顺序如下:
1、输入参数 sigma 和 mean。
2、生成高斯随机数。
3、根据输入像素计算出输出像素。
4、重新将像素值放缩在[0 ~ 255]之间。
5、循环所有像素。
6、输出图像。
import cv2 # 导入 OpenCV 库,用于图像处理
import random # 导入 random 库,用于生成随机数
# 定义添加高斯噪声的函数
def GaussianNoise(src, means, sigma, percentage):
# 将输入图像赋值给 NoiseImg 变量,后续操作在该变量上进行
NoiseImg = src
# 计算要添加的噪声点数
NoiseNum = int(percentage * src.shape[0] * src.shape[1])
# 在图像中随机选择位置添加噪声
for i in range(NoiseNum):
# 生成随机的行坐标
randX = random.randint(0, src.shape[0] - 1) # random.randint 生成随机整数,高斯噪声图片边缘不处理,故-1
# 生成随机的列坐标
randY = random.randint(0, src.shape[1] - 1)
# 通过高斯分布生成随机噪声并添加到图像像素值
NoiseImg[randX, randY] = NoiseImg[randX, randY] + random.gauss(means, sigma)
# 防止像素值越界
# 如果添加噪声后的像素值小于0,则将像素值截断为0
if NoiseImg[randX, randY] < 0:
NoiseImg[randX, randY] = 0
# 如果添加噪声后的像素值大于255,则将像素值截断为255
elif NoiseImg[randX, randY] > 255:
NoiseImg[randX, randY] = 255
# 返回添加噪声后的图像
return NoiseImg
# 读取灰度图像
img = cv2.imread('img/lenna.png', 0)
# 调用添加高斯噪声的函数,对 80% 的像素点加噪
img1 = GaussianNoise(img, 2, 4, 0.8)
# 读取彩色图像
img = cv2.imread('img/lenna.png')
# 将彩色图像转换为灰度图像
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 将添加噪声后的图像保存为文件
# cv2.imwrite('lenna_GaussianNoise.png', img1)
# 显示原始灰度图像
cv2.imshow('source', img2)
# 添加噪声后的图像
cv2.imshow('lenna_GaussianNoise', img1)
# 等待用户按键
cv2.waitKey(0)
2、椒盐噪声
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点。
椒盐噪声 = 椒噪声 (pepper noise)+ 盐噪声(salt noise)。 椒盐噪声的值为0(椒)或者255(盐)。
椒噪声是低灰度噪声,盐噪声属于高灰度噪声。一般两种噪声同时出现,呈现在图像上就是黑白杂点。
对于彩色图像,也有可能表现为在单个像素 BGR 三个通道随机出现的255或0。
如果通信时出错,部分像素的值在传输时丢失,就会发生这种噪声。
椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生等。例如失效的感应器导致像素值为最小值,饱和的感应器导致像素值为最大值。
给一副数字图像加上椒盐噪声的处理顺序如下:
1、指定信噪比 SNR(信号和噪声所占比例) ,其取值范围在[0, 1]之间。
2、计算总像素数目 SP, 得到要加噪的像素数目 NP = SP * SNR。
3、随机获取要加噪的每个像素位置P(i, j)。
4、指定像素值为255或者0。
5、重复3, 4两个步骤完成所有 NP 个像素的加噪。
import cv2 # 导入 OpenCV 库,用于图像处理
import random # 导入 random 库,用于生成随机数
# 定义椒盐噪声函数
def fun1(src, percentage):
# 将输入图像赋值给 NoiseImg 变量,后续操作在该变量上进行
NoiseImg = src
# 计算要添加的椒盐噪声点数
NoiseNum = int(percentage * src.shape[0] * src.shape[1])
# 在图像中随机选择位置添加椒盐噪声
for i in range(NoiseNum):
# 生成随机的行坐标
randX = random.randint(0, src.shape[0] - 1) # random.randint 生成随机整数,椒盐噪声图片边缘不处理,故-1
# 生成随机的列坐标
randY = random.randint(0, src.shape[1] - 1)
# 以50%的概率将像素值设为0或255,模拟椒盐噪声
if random.random() <= 0.5:
NoiseImg[randX, randY] = 0
else:
NoiseImg[randX, randY] = 255
# 返回添加噪声后的图像
return NoiseImg
# 读取灰度图像
img = cv2.imread('img/lenna.png', 0)
# 调用椒盐噪声函数,对 20% 的像素点加噪
img1 = fun1(img, 0.2)
# 将添加椒盐噪声后的图像保存为文件
# cv2.imwrite('lenna_PepperandSalt.png', img1)
# 读取彩色图像
img = cv2.imread('img/lenna.png')
# 将彩色图像转换为灰度图像
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 显示原始灰度图像
cv2.imshow('source', img2)
# 显示添加椒盐噪声后的图像
cv2.imshow('lenna_PepperandSalt', img1)
# 等待用户按键
cv2.waitKey(0)
3、泊松噪声
符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。
如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人数、机器出现的故障数、自然灾害发生的次数、DNA 序列的变异数、放射性原子核的衰变数等等。
时间越长,事件发生的可能越大,且不同时间内发生该事件的概率是相互独立的。
对于非常短的一段时间来说,出现该时间两次的概率几乎为零。
一开始的时候事件没有发生过。
P [ ( N ( t + T ) − N ( t ) ) = k ] = e − λ T ( λ T ) k k ! k = 0 , 1 , . . . P[(N(t+T)-N(t))=k] = \frac{e^{-\lambda T}(\lambda T)^k}{k!}\quad k=0,1,... P[(N(t+T)−N(t))=k]=k