1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数字图像学笔记——6. 噪音生成(椒盐噪音 高斯噪音 泊松噪音)

数字图像学笔记——6. 噪音生成(椒盐噪音 高斯噪音 泊松噪音)

时间:2020-02-25 06:13:10

相关推荐

数字图像学笔记——6. 噪音生成(椒盐噪音 高斯噪音 泊松噪音)

文章目录

噪音的产生噪音函数1. 椒盐噪音(Salt Pepper Noise)2. 高斯噪音(Gaussian Noise)3. 泊松噪音(Poisson Noise)泊松分布(Poisson Distribution)泊松分布与光通量泊松过程(Poisson Process)

噪音的产生

所谓噪音,就是指在原始信号中出现了我们不希望的信号,或者干扰。了解噪音的生成方法,是为了方便我们更好的评估去噪函数。通常,在图像学领域,由于传感器的原因,会出现3种比较常见的噪音。

分别是椒盐噪音、高斯噪音以及泊松噪音。现在就来分别了解下这些噪音的产生原因,以及手工实现噪音产生的方法。

噪音函数

之所以降噪,是因为在图像数据的存储、传输过程中,通常会因为电子元器件之间的电磁干扰产生,又或者图像数据在传输过程中遇到来自自然界、或者人为的干扰。

举个例子来说,过去黑白电视机经常由于电信号干扰,而在图像中产生雪花。又或者是拿一个强磁,对着电子管的电视机进行干扰,而在图像中出现一些水纹波。

那么,工程师们根据经验,把常见噪音进行了以下几种的分类。

1. 椒盐噪音(Salt Pepper Noise)

椒盐噪声(salt-and-pepper noise)又称脉冲噪声,它随机改变一些像素值,在二值图像上表现为使一些像素点变白,一些像素点变黑。 是由图像传感器,传输信道,解码处理等产生的黑白相间的亮暗点噪声,也就是老人们比较熟悉的所谓“雪花”。

N={0pepper255saltN = \left\{\begin{matrix} 0 & pepper\\ 255 & salt \end{matrix}\right. N={0255​peppersalt​

def salt_pepper_noise(image, ratio):output = np.zeros(image.shape, np.uint8)for i in range(image.shape[0]):for j in range(image.shape[1]):rand = random.random()if rand < ratio: # salt pepper noiseif random.random() > 0.5: # change the pixel to 255output[i][j] = 255else:output[i][j] = 0else:output[i][j] = image[i][j]return output

输出效果:

2. 高斯噪音(Gaussian Noise)

文字的描述比较枯燥,我这里就直接贴一张图来说明什么叫高斯噪音

首先从一维来介绍,假设某一种有效信号它表示为μ\muμ,而随着时间的延续,比方说这个信号是来自某种温度传感器,由于传感器老化或者传输信号出现了某种干扰,这些干扰的信号范围在[−3σ,3σ][-3\sigma, 3\sigma][−3σ,3σ]之间,然后我们把这段时间内噪音的振幅收集并且整理后,发现它符合正态分布曲线,亦或者称为高斯曲线,那么这样的噪音就称为高斯噪音。

f(x)=12πσe(−(x−μ)22σ2)f(x) = \frac{1}{ \sqrt {2 \pi } \sigma } e^(- \frac{(x- \mu )^2}{2 \sigma^2} ) f(x)=2π​σ1​e(−2σ2(x−μ)2​)

这个公式简单的说一下:

曲线关于x=μx = \mux=μ 对称,通常这个值对应的是信号本号x=μx = \mux=μ 处为正态分布的最大值,振幅为 12πσ\frac{1}{ \sqrt {2 \pi } \sigma }2π​σ1​,也就是信号本号自身的强度,亦或者说是期望值而σ\sigmaσ所决定的,就是噪音信号的分布情况,数学上称这玩意为标准差当标准差越小,信号噪音就越集中在期望值附近,换句话说也就是信号受噪音影响程度越小,而标准差越大,信号就越模糊。

所以,如果将信号挪到了0上,而噪音分布的标准差为1的时候,这个就是小学二年级所说的标准正态分布了。

现在我们徒手撸一个高斯分布函数的实现:

def gaussian_noise_kernel(x, mu, sigma):exp = math.exp(-1 * (math.pow(x - mu, 2) / (2 * math.pow(sigma, 2))))peak = (math.sqrt(2 * 3.14159) * sigma)return exp / peak

如果用numpy,代码可以写的更简单:

def gaussian_noise_kernel(x, mu, sigma):return np.exp(-1*((x-mu)**2)/(2*(sigma**2)))/(math.sqrt(2*np.pi) * sigma)

然后,我们使用numpy的linspace函数,生成X轴坐标,关于这个函数怎么使用的,你可以网上搜素一下它的函数说明。

用一种比较笨的方法计算Y轴坐标:

mu1, sig1 = 0, 1 # standard distributionmu2, sig2 = 1, 1 # move the chart to rightmu3, sig3 = 0, 0.5 # increase the noise coveragemu4, sig4 = 0, 2.5 # increase the noise coveragex = np.linspace(-5, 5, 100)y1, y2, y3, y4 = [], [], [], []for i in range(50):t1 = gaussian_noise_kernel(x[i], mu1, sig1)t2 = gaussian_noise_kernel(x[i], mu2, sig2)t3 = gaussian_noise_kernel(x[i], mu3, sig3)t4 = gaussian_noise_kernel(x[i], mu4, sig4)y1.append(t1)y2.append(t2)y3.append(t3)y4.append(t4)plt.plot(x, y1, 'r', label='mu1, sig1 = 0, 1')plt.plot(x, y2, 'g', label='mu2, sig2 = 1, 1')plt.plot(x, y3, 'b', label='mu3, sig3 = 0, 0.5')plt.plot(x, y4, 'm', label='mu4, sig4 = 0, 2.5')plt.legend()plt.grid()plt.show()plt.legend()plt.grid()plt.show()

现在我们已经成功的绘制处高斯分布曲线,然后把这个分布曲线函数引入到图像中,用来生成随机噪点。

首先明确一点,高斯噪音的特点是增加或减少原始信号,使得原始信号出现了随机“抖动”,并且抖动范围服从高斯分布(正态分布)。所以如果要生成高斯噪音,那么我们需要在原来高斯核的基础上,增加一个随机数生成器,并且把高斯函数调整为对于X=0轴上的正态分布(不一定是标准正态分布)。

所以,如果有一个正弦信号,那么叠加上高斯噪音后,输出的结果就会呈现上图所示的样子。现在放上实现的代码,它的执行效果不是最好的,但你应该是能看明白噪音的叠加方式。

def gaussian_noise(image, ratio, sigma):# generate gaussian kernelx = np.linspace(- 4 * sigma, 4 * sigma, 100)kernel = gaussian_noise_kernel(x, 0, sigma)# output imageoutput = np.zeros(image.shape, np.uint8)for i in range(image.shape[0]):for j in range(image.shape[1]):rand = random.random()if rand < ratio: # apply gaussian noisepos = int(100 * random.random()if x[pos] < 0:temp = image[i][j] * (1 - kernel[pos])if temp < 0:output[i][j] = 0else:output[i][j] = tempcontinueif x[pos] >= 0:temp = image[i][j] * (1 + kernel[pos])if temp > 255:output[i][j] = 255else:output[i][j] = tempelse:output[i][j] = image[i][j]return output

3. 泊松噪音(Poisson Noise)

简单的说就是满足泊松分布的噪音,你会觉得它和正态分布很相似,其实如果我们采集的数据越多,精度越密,其形态上它越发接近高斯分布函数,也就是正态分布,是常见的一种满足指数函数分布的离散模型。

泊松分布(Poisson Distribution)

泊松噪音存在的根本原因是因为光是由离散的光子构成(光的粒子性)。光源发出的光子打在CMOS上,从而形成一个可见的光点。光源每秒发射的光子到达CMOS的越多,则该像素的灰度值越大。但是因为光源发射和CMOS接收之间都有可能存在一些因素导致单个光子并没有被CMOS接收到或者某一时间段内发射的光子特别多,所以这就导致了灰度值会有波动,也就是所谓的散粒噪声。举例而言,在光源强度比较低的时候,比如说设定光强为每秒5个光子的时候,那么每秒实际CMOS接受到的光子数可能从0到10(服从泊松分布)1。

那么,泊松分布或者泊松噪音的基本形式是怎样的呢?

P(x=k)=e−λλkk!P(x=k) = \frac{e^{- \lambda} \lambda ^ k}{k!} P(x=k)=k!e−λλk​

这里,λ\lambdaλ 表示的是期望值,既某过程中,在它的给定时间内,事件的发生次数,比方说假设世界杯赛场上,每场比赛的进球数大约在2.5个球,那么λ=2.5\lambda=2.5λ=2.5,因此假设对于一场比赛,分别发生0次进球,1次进球,2次进球的概率是2?

出现0次进球

P(x=0)=2.500!e−2.5≈0.082P(x=0) = \frac{2.5^0}{0!} e^{-2.5} \approx 0.082 P(x=0)=0!2.50​e−2.5≈0.082

出现1次进球

P(x=1)=2.511!e−2.5≈0.205P(x=1) = \frac{2.5^1}{1!} e^{-2.5} \approx 0.205 P(x=1)=1!2.51​e−2.5≈0.205

出现2次进球

P(x=2)=2.522!e−2.5≈0.257P(x=2) = \frac{2.5^2}{2!} e^{-2.5} \approx 0.257 P(x=2)=2!2.52​e−2.5≈0.257

出现3次进球

P(x=3)=2.533!e−2.5≈0.213P(x=3) = \frac{2.5^3}{3!} e^{-2.5} \approx 0.213 P(x=3)=3!2.53​e−2.5≈0.213

⋯\cdots ⋯

现在我们把数据绘制到图表上,根据我们推算的进球概率,这样一个概率分布,就是泊松分布了。

泊松分布与光通量

接下来,我们把这个进球的过程换成单位时间内,有多少光子打到像素传感器上的过程3。为了说明这个问题,我们先解释一下照片成像的过程。我们在初中阶段的光学课程上,知道以前的老式相机是光束通过透镜,与胶片上的光感材料作用,把影像印在了胶片上,这个过程和小孔成像很类似。

而现代数码相机的普及,最大的区别就是胶片变成了光传感器。也就是CMOS传感器。由于它是一种光敏材料,在被一定量的光子照射后会产生电子,继而引起数字信号的变化。而在一个CMOS传感器上,有极多的传感单元,而这些传感单元,你可以理解为我们平常提到的像素。

而光子作用在每一个传感单元上所产生的信号不同,最终组合在一起成为了像素照片。所以如果我们把这个过程简化后,假设在单位时间内,有一束光包含有400个光子打到了相机的CMOS传感器上,从微观上说,这些光子是随机的落入到不同的像素传感器内。

因此对应一个像素传感器来说,如果我们统计一个像素在单位时间ttt内,会有多少个光子落入到一个像素传感器内,那么可能会得出[0,4][0,4][0,4]这样的一个结果。那么统计平均落入的光子数,并且绘制它的落入分布情况,我们可能会得出一个泊松分布。

假设这个情况的λ=1.05\lambda=1.05λ=1.05,也就是平均每个像素传感器落入1.05个光子,那么它的概率分布图,也就是下面这个样子了:

那么这个模型的标准差σ=∑(xi−xˉ)n≈1.024\sigma = \sqrt{\frac{\sum (x_i - \bar{x})}{n}} \approx 1.024σ=n∑(xi​−xˉ)​​≈1.024,而这里的1.024就是光子散粒噪音(photon shot noise)

由于光子极微小,尽管我们假设从物体反射进入到CMOS传感器上的光束在单位时间内为400个光子,但这数量本质上来说是估算,或者说是平均数。因此实际上在单位时间ttt内,传入CMOS的光子数可能是401,也可能是387个光子。

尽管从宏观上光子传播沿直线传播,但在微观上也就是光子运动轨迹存在一定程度的不确定性,这必然导致了噪音的产生。

所以我们可以直观的凭本能知道,如果这样一些带着随机运动的粒子,在击打到某个平面位置时,尽管大范围上符合某个范围的分布区间,但如果细致的观察,每一个落点存在着一定的误差(“噪音”)。

这就像是用霞弹枪、或者抛洒石灰,或者颜料,即便用同一种颜料,同一个角度抛洒到画布上,任然无法做出两幅一样的画的那种奇妙的感觉。

那么,光子到达图像传感器的这些波动如何影响我们的图像?噪点会使照片的视觉细节失真。而下图显示了一组模拟的图像,其中指定了每个像素的平均粒子数或光子数。 这表明对于低数量的光子,噪声占主导地位,但是随着光子数量(光通量)的增加,图像结构变得更加明显。

所以,如果我们要试图模拟泊松噪音,也就是单位像素传感器ppp在单位时间ttt内捕捉到的有效光子量,那么这个过程就是一个所谓的“泊松过程(Poisson Process)”

泊松过程(Poisson Process)

现在,我们已经知道了一个概率事件它的随机概率发生分布情况,如果近似符合二项分布的,就是一个泊松分布。现在我们需要反过来,去做一个符合这个分布的随机事件发生过程,而它就是所谓的泊松过程了。

回到上面的例子,如果在单位事件内ttt,向CMOS传感器发射了(或者说物体反射了)一束包含400个光子光束,落在单个像素传感器上的光子数为 Ps∈[0,4]P_s \in[0, 4]Ps​∈[0,4] ,我们在不考虑这些光子激发的电子有效率的情况下,假设1个光子落入了像素传感器就会产生1个电子。

也就是说,在单位时间内,一个像素可能接收到0个、1个、2个、3个、4个光子4。而如果我们把观察时间微分为Δt\Delta tΔt,如果假设在某一个时间内,发生了1个光子击中像素传感器,那么接下来再发生一次光子击中像素传感器的概率就会下降;如果再次发生一次击中,那么等待第三次发生的概率就会更小,直到全部观察时间结束。

这一过程符合于指数,通常情况下,我们用下式表示这个过程,用通俗的话来描述:就是当某事件发生后,后续事件再次发生的概率,随着时间增加而减少

P(twait>tevent)=e−σ⋅tP(t_{wait} > t_{event}) = e^{- \sigma \cdot t}P(twait​>tevent​)=e−σ⋅t

这里ttt表示时间变量,σ\sigmaσ表示单位时间内Δt\Delta tΔt事件怕平均发生次数,或者说是期望。那么,我们同样可以得出某事件发生前的前面的事件发生概率,随着时间减少而增加

P(twait≤tevent)=1−e−σ⋅tP(t_{wait} \leq t_{event}) = 1 - e^{- \sigma \cdot t}P(twait​≤tevent​)=1−e−σ⋅t

明白了这个公式的概念,接下来我们就可以来模拟这个泊松过程了,那么受限于篇幅,生成泊松随机数的过程我就放在下一章里进行介绍了。

《泊松噪音》 ↩︎

Poisson Distribution, Alexander Katz, Andy Hayes, Tejas Suresh, etc. ↩︎

How to Create Awesome Noise That Is Actually Real, Erez Posner

↩︎

The Poisson Distribution and Poisson Process Explained, Will Koehresen ↩︎

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。