噪声生成
1、图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理
的信号。
2、图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产
生图像噪声的主要因素是所用的传输信道受到了噪声的污染。
一、高斯噪声
高斯噪声(Gaussian noise)是指它的概率密度函数服从高斯分布的一类噪声。
• 特别的,如果一个噪声,它的幅度分布服从高斯分布,而它的任意两个采样样本之间不相关,则
称它为高斯白噪声。
• 必须区分高斯噪声和白噪声两个不同的概念。高斯噪声是指噪声的概率密度函数服从高斯分布,
白噪声是指噪声的任意两个采样样本之间不相关,两者描述的角度不同。白噪声不必服从高斯分
布,高斯分布的噪声不一定是白噪声。
产生原因:
1)图像传感器在拍摄时不够明亮、亮度不够均匀;
2)电路各元器件自身噪声和相互影响;
3)图像传感器长期工作,温度过高
一个正常的高斯采样分布公式, 得到输出像素Pout.
Pout = Pin + random.gauss
其中random.gauss是通过sigma和mean来生成符合高斯分布的随机数。
给一副数字图像加上高斯噪声的处理顺序如下:
a. 输入参数sigma 和 mean
b. 生成高斯随机数
d. 根据输入像素计算出输出像素
e. 重新将像素值放缩在[0 ~ 255]之间
f. 循环所有像素
g. 输出图像
python实现
import cv2
import random
def GaussianNoise(src,means,sigma,percetage):
'''
:param src: 要加噪声的图片
:param means: 高斯噪声的均值
:param sigma: 高斯噪声的标准差
:param percetage: 需要加噪声的像素占总像素的比例
:return: 加噪声后的图像
'''
NoiseImg = src
NoiseNum = int(percetage * src.shape[0] * src.shape[1]) # 计算需要加噪声的总像素数
for i in range(NoiseNum):
# 随机生成一个像素位置(randX,randY)
# 把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
# random.randint生成随机整数
# 高斯噪声图片边缘不处理,故-1
randX = random.randint(0, src.shape[0] - 1) # 随机生成行
randY = random.randint(0, src.shape[1] - 1) # 随机生成列
# 此处在原有像素灰度值上加上随机高斯数
NoiseImg[randX, randY] = NoiseImg[randX, randY] + random.gauss(means, sigma) # 随机生成的像素位置加上高斯噪声
# 若灰度值小于0则强制为0,若灰度值大于255则强制为255
if NoiseImg[randX, randY] < 0:
NoiseImg[randX, randY] = 0
elif NoiseImg[randX, randY] > 255:
NoiseImg[randX, randY] = 255
return NoiseImg
means = 10
sigma = 0.5
img = cv2.imread('lenna.png',0)
img1 = GaussianNoise(img,means,sigma,0.8)
img = cv2.imread('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)
二、椒盐噪声
椒盐噪声又称为脉冲噪声,它是一种随机出现的白点或者黑点。
• 椒盐噪声 = 椒噪声 (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个像素的加噪
python实现
import cv2
import random
def fun1(src,percetage):
'''
:param src: 要加噪声的图片
:param percetage: 需要加噪声的像素占总像素的比例
:return: 加噪声后的图像
'''
NoiseImg=src
NoiseNum=int(percetage*src.shape[0]*src.shape[1])
for i in range(NoiseNum):
# 随机生成一个像素位置(randX,randY)
# 把一张图片的像素用行和列表示的话,randX 代表随机生成的行,randY代表随机生成的列
# random.randint生成随机整数
# 椒盐噪声图片边缘不处理,故-1
randX=random.randint(0,src.shape[0]-1)
randY=random.randint(0,src.shape[1]-1)
# random.random生成随机浮点数,随意取到一个像素点有一半的可能是白点255,一半的可能是黑点0
if random.random() <= 0.5:
NoiseImg[randX,randY] = 0
else:
NoiseImg[randX,randY] = 255
return NoiseImg
img=cv2.imread('lenna.png',0)
img1=fun1(img,0.2)
#在文件夹中写入命名为lenna_PepperandSalt.png的加噪后的图片
#cv2.imwrite('lenna_PepperandSalt.png',img1)
img = cv2.imread('lenna.png')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('source',img2)
cv2.imshow('lenna_PepperandSalt',img1)
cv2.waitKey(0)
三、其他噪声
泊松噪声: 符合泊松分布的噪声模型,泊松分布适合于描述单位时间内随机事件发生的次数的概率分布。
如某一服务设施在一定时间内受到的服务请求的次数,电话交换机接到呼叫的次数、汽车站台的候客人
数、机器出现的故障数、自然灾害发生的次数、DNA序列的变异数、放射性原子核的衰变数等等。
乘性噪声: 一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在。
瑞利噪声: 相比高斯噪声而言,其形状向右歪斜,这对于拟合某些歪斜直方图噪声很有用。瑞利噪声的
实现可以借由平均噪声来实现。
伽马噪声: 其分布服从了伽马曲线的分布。伽马噪声的实现,需要使用b个服从指数分布的噪声叠加而
来。指数分布的噪声,可以使用均匀分布来实现。(b=1时为指数噪声,b>1时通过若干个指数噪声叠
加,得到伽马噪声)
拓展-泊松噪声
- 时间越长,事件发生的可能越大,且不同时间内发生该事件的概率是相互独立的
- 对于非常短的一段时间来说,出现该时间两次的概率几乎为零
- 一开始的时候事件没有发生过