图像降噪算法——图像噪声模型

  • 图像降噪算法——图像噪声模型
    • 1. 图像噪声建模
    • 2. C++代码实现
    • 3. 结论

图像降噪算法——图像噪声模型

1. 图像噪声建模

首先,我们要区分图像传感器噪声图像噪声,图像传感器噪声我在博客图像传感器与信号处理——详解图像传感器噪声中有过总结,图像传感器噪声会造成各种各样的图像噪声。

其次,我们需要了解图像降噪模型,图像降噪模型可以建模为:y=x+ny=x+ny=x+n其中,yyy是观察到的噪声图像,xxx是图像真值,nnn是图像噪声,图像降噪过程就是通过yyy获取xxx,在许多论文中将这个过程描述为不可逆过程,这也就是为什么图像降噪难。本博客就是对图像噪声nnn进行建模:

《数字图像处理》一书中对噪声建模主要有一下几种类型:

(1)高斯噪声
高斯噪声是最常见也是最重要的的一种噪声,众多的图像降噪算法都是以降低高斯噪声为目标设计的,其概率密度函数如下所示:p(z)=12πσ2e−(z−μ)2/2σ2p(z)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} e^{-(z-\mu)^{2}} /_{2 \sigma^{2}}p(z)=2πσ2​1​e−(z−μ)2/2σ2​其中,σ\sigmaσ是标准偏差,μ\muμ是灰度值的平均值,这个公式说明的是灰度值为zzz的概率为多少。

(2)瑞利噪声
瑞丽噪声的概率密度函数如下所示:p(z)={2b(z−a)e−(z−a)2/b,z⩾a0,z<ap(z)=\left\{\begin{array}{ll} \frac{2}{b}(z-a) \mathrm{e}^{-(z-a)^{2} / b}, & z \geqslant a \\ 0, & z<a \end{array}\right.p(z)={b2​(z−a)e−(z−a)2/b,0,​z⩾az<a​概率密度的均值和方法分别为:zˉ=a+πb/4\bar{z}=a+\sqrt{\pi b / 4}zˉ=a+πb/4​σ2=b(4−π)4\sigma^{2}=\frac{b(4-\pi)}{4}σ2=4b(4−π)​瑞利噪声对于图像直方图近似倾斜的图像中的噪声建模较为有效。

(3)伽马噪声
伽马噪声的概率密度函数如下所示:p(z)={abzb−1(b−1)!e−az,z⩾a0,z<ap(z)=\left\{\begin{array}{cl} \frac{a^{b} z^{b-1}}{(b-1) !} \mathrm{e}^{-a z}, & z \geqslant a \\ 0, & z<a \end{array}\right.p(z)={(b−1)!abzb−1​e−az,0,​z⩾az<a​其中均值和方差分别为zˉ=ba\bar{z}=\frac{b}{a}zˉ=ab​σ2=ba2\sigma^{2}=\frac{b}{a^{2}}σ2=a2b​伽马噪声相对瑞利噪声分布会更加倾斜

(4)指数噪声
指数噪声的概率密度函数如下所示:p(z)={ae−az,z⩾00,z<0p(z)=\left\{\begin{array}{ll} a \mathrm{e}^{-a z}, & z \geqslant 0 \\ 0, & z<0 \end{array}\right.p(z)={ae−az,0,​z⩾0z<0​其概率密度函数的均值和方差分别为zˉ=1a\bar{z}=\frac{1}{a}zˉ=a1​σ2=1a2\sigma^{2}=\frac{1}{a^{2}}σ2=a21​指数噪声分布相对伽马噪声又会进一步倾斜

(5)量化噪声
量化噪声又称均匀噪声,此类噪声是由于将模拟数据转换为数字数据而引起的,因此是幅度量化过程中固有的,其概率密度函数如下:p(z)={1b−a,a⩽z⩽b0otherwisep(z)=\left\{\begin{array}{ll} \frac{1}{b-a}, & a \leqslant z \leqslant b \\ 0 & otherwise \end{array}\right.p(z)={b−a1​,0​a⩽z⩽botherwise​
(6)椒盐噪声
椒盐噪声又称脉冲噪声、尖峰噪声,在图像上表现为随机分布的黑白点,其概率密度函数如下图所示:
p(z)={Pa,z=aPb,z=b1−Pa−Pb,otherwisep(z)=\left\{\begin{array}{ll} P_{a}, & z=a \\ P_{b}, & z=b \\ 1-P_{a}-P_{b}, & otherwise \end{array}\right.p(z)=⎩⎨⎧​Pa​,Pb​,1−Pa​−Pb​,​z=az=botherwise​椒盐噪声可以通过中值滤波器进行消除。

以上即《数字图像处理》中对各个图像噪声的建模,对于的概率密度函数的不同,书中给出了这样一张图予以区分:
那么除了《数字图像处理》中提到的几种图像噪声模型外,一般还有如下几种模型:

(7)泊松噪声
泊松噪声又称散粒噪声,我们知道,光源每秒发射的光子到达CMOS的越多,则该像素的灰度值越大。但是因为光源发射和CMOS接收之间都有可能存在一些因素导致某个光子并没有被CMOS接收到或者某个像素一时间段内发射的光子特别多,所以这就导致了灰度值的波动,也就产生了泊松噪声,方程描述为:p[(N(t+τ)−N(t))=k]=e−λτ(λτ)kk!k=0,1,…p[(N(t+\tau)-N(t))=k]=\frac{e^{-\lambda \tau}(\lambda \tau)^{k}}{k !} \quad k=0,1, \dotsp[(N(t+τ)−N(t))=k]=k!e−λτ(λτ)k​k=0,1,…这个公式说明的是某个像素在间隔时间τ\tauτ内接收到kkk个光子的概率为多少。

(8)斑点噪声
在相干成像系统(如雷达,激光和声学等)中可以看到斑点噪声的出现,其概率密度函数如下:p(z)=za−1e−z/aa−1!aap(z)=\frac{z^{a-1} e^{-z / a}}{a-1 ! a^{a}}p(z)=a−1!aaza−1e−z/a​斑点噪声在光学成像系统中很少出现,因此这里不作赘述。

(6)周期性噪声
周期性噪声无法用概率密度函数进行描述,也无法在空间域中进行消除,通常的方法是通过频域中的带阻滤波器进行消除,如下图所示,从左至右,第一幅图原始图像,第二幅图为频域图像,第三幅图为带阻滤波器,第四幅图为滤波后的图像。

2. C++代码实现

下面分别是生成椒盐噪声和高斯噪声的函数:

at Noise::CreateSaltNoise(const Mat &src, int n)
{Mat dst = src.clone();for(int k = 0; k<n; k++){int i = rand() % dst.rows;int j = rand() % dst.cols;if(dst.channels() == 1){dst.at<uchar>(i,j) = 255;}else{dst.at<Vec3b>(i,j)[0] = 255;dst.at<Vec3b>(i,j)[1] = 255;dst.at<Vec3b>(i,j)[2] = 255;}}for(int k = 0; k<n; k++){int i = rand() % dst.rows;int j = rand() % dst.cols;if(dst.channels() == 1){dst.at<uchar>(i,j) = 0;}else{dst.at<Vec3b>(i,j)[0] = 0;dst.at<Vec3b>(i,j)[1] = 0;dst.at<Vec3b>(i,j)[2] = 0;}}return dst;
}Mat Noise::CreateGaussianNoise(const Mat &src, double mu, double sigma)
{Mat dst = src.clone();int row = dst.rows;int col = dst.cols;for(int i = 0; i<row; i++){for(int j = 0; j<col; j++){if(dst.channels() == 1){//构建高斯噪声double u1, u2;do{u1 = rand() * (1.0 / RAND_MAX);u2 = rand() * (1.0 / RAND_MAX);} while (u1 <= numeric_limits<double>::min());//u1不能为0double z = sigma * sqrt(-2.0 * log(u1)) * cos(2 * CV_PI * u2) + mu;//double z = sigma * sqrt(-2.0 * log(u1)) * sin(2 * CV_PI * u2) + mu;int val = dst.at<uchar>(i,j) + z * 32;val = (val<0)?0:val;val = (val>255)?255:val;dst.at<uchar>(i,j) = (uchar)val;}else{for(int k = 0; k<dst.channels(); k++){//构建高斯噪声double u1, u2;do{u1 = rand() * (1.0 / RAND_MAX);u2 = rand() * (1.0 / RAND_MAX);} while (u1 <= numeric_limits<double>::min());//u1不能为0double z = sigma * sqrt(-2.0 * log(u1)) * cos(2 * CV_PI * u2) + mu;//double z = sigma * sqrt(-2.0 * log(u1)) * sin(2 * CV_PI * u2) + mu;int val = dst.at<Vec3b>(i,j)[k] + z * 32;int test = dst.at<Vec3b>(i,j)[k];val = (val<0)?0:val;val = (val>255)?255:val;dst.at<Vec3b>(i,j)[k] = (uchar)val;}}}}return dst;
}

下面是运行结果:
首先,下面是原图:

加上高斯噪声后的结果

加上椒盐噪声后的结果:

3. 结论

  1. 高斯噪声、瑞丽噪声、伽马噪声、指数噪声其实是比较类似的,只是统计分布会稍有区别,如果用代码实现应该是类似的。
  2. 研究图像噪声模型对于图像降噪算法的实现是非常重要的,比如我看Review的时候就有大佬提到,对于目前效果最好的深度学习降噪算法,其难于实际应用的一个方面就是训练模型所用的噪声都是高斯噪声,而我们摄像头拍摄图像的实际噪声要远比高斯噪声复杂,因此如果更好地对图像噪声进行建模非常重要。

那这一小节就总结到这儿啦,有问题欢迎交流~

此外,这里我写一个各种算法的总结目录图像降噪算法——图像降噪算法总结,对图像降噪算法感兴趣的同学欢迎参考

图像降噪算法——图像噪声模型相关推荐

  1. 图像降噪算法——图像降噪算法总结

    图像降噪算法--图像降噪算法总结 图像降噪算法--图像降噪算法总结 图像降噪算法--图像降噪算法总结 前面这段时间我看了几篇和图像降噪相关的Review,给我的感觉就是SLAM这一研究领域像是一片汪洋 ...

  2. 图像降噪算法——稀疏表达:K-SVD算法

    图像降噪算法--稀疏表达:K-SVD算法 图像降噪算法--稀疏表达:K-SVD算法 1. 基本原理 2. python代码 3. 结论 图像降噪算法--稀疏表达:K-SVD算法 为了完善下自己降噪算法 ...

  3. 图像降噪算法——DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID

    图像降噪算法--DnCNN / FFDNet / CBDNet / RIDNet / PMRID / SID 图像降噪算法--DnCNN / FFDNet / CBDNet / RIDNet / PM ...

  4. 图像降噪算法——维纳滤波

    图像降噪算法--维纳滤波 图像降噪算法--维纳滤波 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--维纳滤波 维纳滤波是在频域中处理图像的一种算法,是一种非常经典的图像增强算法,不仅 ...

  5. 图像降噪算法——低秩聚类:WNNM算法

    图像降噪算法--低秩聚类:WNNM算法 图像降噪算法--低秩聚类:WNNM算法 1. 基本原理 2. matlab代码 3. 结论 图像降噪算法--低秩聚类:WNNM算法 同样是为了完善自己知识版图的 ...

  6. 图像降噪算法——Variance Stabilizing Transform / Generalization Anscombe Transform算法

    图像降噪算法--Variance Stabilizing Transform / Generalization Anscombe Transform算法 图像降噪算法--Variance Stabil ...

  7. 图像降噪算法——时域降噪算法

    图像降噪算法--时域降噪算法 图像降噪算法--时域降噪算法 1.<MeshFLow Video Denoising> 2. <Real-Time Video Denoising On ...

  8. 图像降噪算法——小波硬阈值滤波(下)

    图像降噪算法--小波硬阈值滤波(下) 图像降噪算法--小波硬阈值滤波(下) 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--小波硬阈值滤波(下) 1. 基本原理 关于离散小波变换的原 ...

  9. 图像降噪算法——高斯低通滤波

    图像降噪算法--高斯低通滤波 图像降噪算法--高斯低通滤波 1. 基本原理 2. C++代码实现 3. 结论 图像降噪算法--高斯低通滤波 1. 基本原理 通过离散傅里叶变换对图像进行滤波流程作非常简 ...

最新文章

  1. Tomcat官方文档关于数据源配置的内容
  2. python如何爬虫-如何使用python写爬虫程序
  3. 联想rd540服务器怎么装系统,联想RD540加显卡BIOS设置
  4. linux 查看flash大小,Linux OpenWRT查看CPU,RAM,Flash信息参数
  5. C#Word转Html的类
  6. 安卓逆向_25 --- 密码学 之 《Java加密与解密的艺术》
  7. CSS属性之position
  8. 传奇服务器玩家信息备份,传奇:史上5大漏洞,损失惨重,盛大被迫将服务器回档2天...
  9. 如何转换html转化mp4,格式互转技巧:webm格式怎么转换mp4?
  10. DeepinXP_V5.8完美/增强精简版2合1
  11. 未来教育python软件_未来教育考试系统
  12. Django项目部署到腾讯云服务器
  13. 计算机语言中print是什么意思,PASCAL 语言中print是什么意思?
  14. 不敢相信!那些真实存在的机器人女友们!
  15. 软件企业具体可享受哪些所得税优惠政策?
  16. 怎么在腾讯云函数抖音无水印解析接口部署
  17. 基于对抗生成网络的图像转换技术【论文笔记】
  18. 7-6 吃鱼还是吃肉 (20 分)
  19. libuv访问mysql_libuv中的QUEUE
  20. 12月14日:跟着猫叔写代码api中的增删改查

热门文章

  1. python polar contour_Python将2darray的最后一行和第二列添加到最后位置 - Polar Contour图...
  2. 【堆】堆的基本操作总结
  3. 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!
  4. 【深入Java虚拟机JVM 03】Java内存模型
  5. java类初始化顺序_「漫画」Java中的父子类的执行顺序到底是怎么一回事?
  6. 两款爱不释手的markdown编辑工具
  7. VueX(Vue状态管理模式)
  8. 使用python写一个名片管理系统
  9. MyBatis映射文件(一)
  10. 解析java中的数组