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

article/2025/9/30 3:30:02

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

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

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

1. 图像噪声建模

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

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

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

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

(2)瑞利噪声
瑞丽噪声的概率密度函数如下所示: p ( z ) = { 2 b ( z − a ) e − ( z − a ) 2 / b , z ⩾ a 0 , z < a p(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(za)e(za)2/b,0,zaz<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 ) = { a b z b − 1 ( b − 1 ) ! e − a z , z ⩾ a 0 , z < a p(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)={(b1)!abzb1eaz,0,zaz<a其中均值和方差分别为 z ˉ = b a \bar{z}=\frac{b}{a} zˉ=ab σ 2 = b a 2 \sigma^{2}=\frac{b}{a^{2}} σ2=a2b伽马噪声相对瑞利噪声分布会更加倾斜

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

(5)量化噪声
量化噪声又称均匀噪声,此类噪声是由于将模拟数据转换为数字数据而引起的,因此是幅度量化过程中固有的,其概率密度函数如下: p ( z ) = { 1 b − a , a ⩽ z ⩽ b 0 o t h e r w i s e p(z)=\left\{\begin{array}{ll} \frac{1}{b-a}, & a \leqslant z \leqslant b \\ 0 & otherwise \end{array}\right. p(z)={ba1,0azbotherwise
(6)椒盐噪声
椒盐噪声又称脉冲噪声、尖峰噪声,在图像上表现为随机分布的黑白点,其概率密度函数如下图所示:
p ( z ) = { P a , z = a P b , z = b 1 − P a − P b , o t h e r w i s e p(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,1PaPb,z=az=botherwise椒盐噪声可以通过中值滤波器进行消除。

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

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

(8)斑点噪声
在相干成像系统(如雷达,激光和声学等)中可以看到斑点噪声的出现,其概率密度函数如下: p ( z ) = z a − 1 e − z / a a − 1 ! a a p(z)=\frac{z^{a-1} e^{-z / a}}{a-1 ! a^{a}} p(z)=a1!aaza1ez/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的时候就有大佬提到,对于目前效果最好的深度学习降噪算法,其难于实际应用的一个方面就是训练模型所用的噪声都是高斯噪声,而我们摄像头拍摄图像的实际噪声要远比高斯噪声复杂,因此如果更好地对图像噪声进行建模非常重要。

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

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


http://chatgpt.dhexx.cn/article/PcYdoEkG.shtml

相关文章

医学成像系列:医学图像噪声

介绍和概述 通常希望图像亮度&#xff08;或膜密度&#xff09;是均匀的&#xff0c;除非它改变以形成图像。然而&#xff0c;有些因素即使在不存在图像细节时也倾向于产生所显示图像的亮度的变化。这种变化通常是随机的&#xff0c;没有特定的模式。在许多情况下&#xff0c;…

图像噪声的特点以及分类(一)

前言&#xff1a;本文根据不同的指标对图像的噪声进行分类。 一、图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质&#xff0c;这对后续图像的处理和图像视觉效应将产生不利影响。噪声种类很多&#xff0c;比如:电噪声&#xff0c;机械噪声…

图像噪声(MATLAB)

1.概念 所谓的图像噪声&#xff0c;是图像在摄取时或是传输时所受到的随机干扰信号。 常见的有高斯噪声和椒盐噪声。 &#xff08;1&#xff09;高斯噪声 高斯噪声是一种源于电子电路噪声和由低照明度或高温带来的传感器噪声。高斯噪声也常称为正态噪声&#xff0c;因为曲线符…

图像处理之图像噪声和各种噪声的matlab实现

一、图像噪声的基本定义 噪声在图像上常表现为引起较强视觉效果的孤立像素点或像素块。一般噪声信号与要研究的对象不相关&#xff0c;其以无用的信息形式出现&#xff0c;扰乱图像的可观测信息。通俗的说即噪声让图像不清楚。 图像噪声按照噪声和信号之间的关系可以分为加性…

图像噪声模型(matlab)

概述 在图像的采集、传送和转换过程中&#xff0c;会添加一些噪声&#xff0c;表现为图像模糊、失真和有噪声等。图像复原就是尽可能恢复退化图像的本来面目&#xff0c;沿用图像退化的逆过程进行处理。图像复原技术是根据图像退化的先验知识建立一个退化模型&#xff0c;以此…

OpenCV 图像噪声

图像噪声 由于图像采集、处理、传输等过程不可避免的会受到噪声的污染&#xff0c;妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。 1.1椒盐噪声 椒盐噪声也称为脉冲噪声&#xff0c;是图像中经常见到的一种噪声&#xff0c;它是一种随机出现的白点或…

图像噪声学习总结

目录 一、图像噪声 1.1.图像噪声概念 1.2.噪声来源—两个方面 1.3. 图像噪声的特征 1.4.图像噪声的分类 1.4.1常见的图像噪声主要有以下几种&#xff1a; 1.4.2 图像噪声模型 &#xff08;1&#xff09;高斯噪声 &#xff08;2&#xff09;脉冲噪声&#xff08;椒盐噪…

图像噪声与去噪

图像的空域噪声以及二维降噪算法介绍 1 图像噪声的成因 图像在生成和传输过程中常常因受到各种噪声的干扰和影响而是图像降质&#xff0c;这对后续图像的处理和图像视觉效应将产生不利影响。噪声种类很多&#xff0c;比如:电噪声&#xff0c;机械噪声&#xff0c;信道噪声和其他…

图像噪声处理

一、为图像添加噪声 为图像添加噪声可以起到数据增强的作用 对训练数据添加适量噪声&#xff0c;可以使训练后的模型更加鲁棒&#xff0c;对模型的性能提升有一定的帮助。 两种常用噪声&#xff1a;椒盐噪声和高斯噪声 import cv2 import numpy as np import random #添加椒…

图像噪声简介

一、什么是图像噪声&#xff1f; 噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。一般&#xff0c;噪声信号与要研究的对象不相关&#xff0c;它以无用的信息形式出现&#xff0c;扰乱图像的可观测信息。通俗的说就是噪声让图像不清楚。 二、噪声来源—两个方面…

VS找不到标识符

情况一&#xff1a; 忘记加&#xff1a;&#xff1a; 情况二&#xff1a; 没有包含相应的头文件 #include “xxx”** 情况三&#xff1a; 调用函数没有声明或定义

VS C++程序报错:找不到标识符

报错如下&#xff1a; 原因&#xff1a; cpp编译时是顺序编译的&#xff0c;我在一个函数中嵌套使用了上面报错的InsertNextNode&#xff08;&#xff09;函数&#xff0c;而把InsertNextNode&#xff08;&#xff09;函数的定义放在了上一个函数的后面&#xff0c;所以报错找…

c++编译错误error C3861: “xxxx”: 找不到标识符

错误描述 在导入自定义的头文件时&#xff0c;报C3861 “_ReturnAddress”: 找不到标识符错误&#xff0c;错误信息如下 解决办法 在自定义的头文件前面导入&#xff0c;指向的头文件即可 include ""//自定义头文件 include <ppltasks.h> 参考&#xff…

找不到标识符问题

复习动态数组时&#xff0c;出现了找不到标识符的问题&#xff0c;原因是cpp编译时是“顺序编译”的&#xff0c;主函数调用vector_2()函数的时&#xff0c;vector_2()在它所调用的函数printfV()的定义之前&#xff0c;因此找不到标识符。 将两函数调换顺序即可编译通过 &…

编写C语言出现“找不到标识符”

用C语言编写代码的时候虽然是从main函数开始的。但是其中有一个编译的过程。这个过程就是顺序编译。例如函数2调用了函数1。 #include<iostream> using namespace std; void print2() {cout << "调用第一个函数";print1();//调用第一个函数 } void prin…

关于error C3861: “xxxx”: 找不到标识符的处理方法

关于 error c3861:“XXXX”&#xff1a;找不到标识符的见解 在写代码是编译器提醒了找不到标识符的错误下来学习了一下,总结了一下希望对大家有帮助,先来认识一下什么是标识符&#xff08;如果知道就当巩固复习&#xff09;。 标识符:标识符&#xff08;identifier&#xff09…

error C3861: “AT_CHECK”: 找不到标识符

今天跑别人代码时遇到这个问题 会提示我 error C3861: “AT_CHECK”: 找不到标识符 我搜了一下发现在pytorch1.5版本之后AT_CHECK标识符已经不再使用了 只需要把 AT_CHECK 换成 TORCH_CHECK 即可

VS 2022 :C3861 “Covers”: 找不到标识符

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3861 “Covers”: 找不到标识符 CampusGuide 没有声明函数是无法调用的哦&#xff01; 还有还有 如果你的多行注释不是成对出现&#xff0c;它就会这样提示&#xff1a; 错误(活动) E00…

成功解决error C3861: “printf”: 找不到标识符

问题描述&#xff1a; 错误如下&#xff1a;error C3861: “printf”: 找不到标识符。 解决方法 提示找不到标识符“printf”&#xff0c;猜想这可能是由于编译器没能包含进头文件stdio.h造成的&#xff0c;然后我就在代码上面重新写了一行#include<stdio.h>,之后再运行…

“pcl_isfinite”: 找不到标识符

错误信息是&#xff1a;“pcl_isfinite”: 找不到标识符 我搜了&#xff0c;好多网站&#xff0c;搜了好多包&#xff0c;都没有这个“pcl_isfinite”的定义。后来看别人的代码找到了。。。 在我们自己的代码中&#xff1a;添加一行&#xff1a; # define pcl_isfinite(x) s…