数字图像处理:噪声模型(椒盐噪声、高斯噪声)
2018-03-13 22:55阅读:
转载请表明出处:
图像噪声是图像在获取或传输过程中受到随机信号干扰,妨碍人们对图像理解及分析的信号。很多时候将图像噪声看作多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述,即使用其概率分布函数和概率密度分布函数。图像噪声的产生来自图像获取中的环境条件和传感元器件自身的质量,图像在传输过程中产生图像噪声的主要因素是所用的传输信道受到噪声污染。
1、椒盐噪声
椒盐噪声是数字图像中的常见噪声,一般是由图像传感器、传输信道及解码处理等产生的黑白相见的亮暗点噪声,椒盐噪声常由图像切割产生。椒盐噪声是指两种噪声:盐噪声(salt
noise)及椒噪声(pepper
noise)。盐噪声一般是白色噪声,椒噪声一般是黑色噪声,前者高灰度噪声,后者属于低灰度噪声,一般两种噪声同时出现,呈现在图像上就是黑白杂点。图像去除脉冲干扰及椒盐噪声最常用的算法是中值滤波,图像模拟添加椒盐噪声是通过随机获取像素值点并设置为高亮点来实现的。
参考代码:
NormalText Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
|
#include |
#include
#include
//
图像添加椒盐噪声
cv::Mat
addSaltNoise(const
cv::Mat
srcImage,
int
n)
{
cv::Mat
resultIamge
=srcImage.clone()
;
for(int
k=0;
k
{
//
随机取值行列
int
i
=
rand()
%
resultIamge.cols;
int
j
=
rand()
%
resultIamge.rows;
//
图像通道判定
if(resultIamge.channels()
==
1)
{
resultIamge.at(j,i)
=
255;
}else
{
resultIamge.at(j,i)[0]
=
255;
resultIamge.at(j,i)[1]
=
255;
resultIamge.at(j,i)[2]
=
255;
}
}
return
resultIamge;
}
int
main()
{
cv::Mat
srcImage
=
cv::imread('22.jpg');
if(
srcImage.empty())
return
-1;
cv::Mat
resultImage
=
addSaltNoise(srcImage,
5000);
cv::imshow('srcImage',srcImage);
cv::imshow('resultImage',resultImage);
cv::waitKey(0);
}
2.高斯噪声
高斯噪声是指概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度服从高斯分布,而它的功率谱密度又是分布均匀的,则称它为高斯白噪声。高斯白噪声的二阶矩不想关,一阶矩为常数,是指先后信号在时间上的相关性。高斯白噪声包括热噪声和散粒噪声。高斯噪声完全由其时变平均值和两瞬时的协方差函数来确定,若噪声为平稳的,则平均值与时间无关,而协方差函数则变成仅和所考虑的两瞬时之方差有关的相关函数,它在意义上等效于功率谱密度。高斯噪声可以由大量独立的脉冲产生,从而在任何有限时间间隔内,这些脉冲中的每一个脉冲值与所有脉冲值的总和相比都可以忽略不计。
根据Box-Muller变换原理,假设随机变量U1,U2来自独立的处于(0,1)之间的均匀分布,则进过下面两个式子产生的随机变量Z0、Z1服从标准高斯分布:

上式中Z0、Z1满足正态分布,其中均值为0,方差为1;
参考代码:
NormalText Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
|
#include
#include
#include
#include
using namespace cv;
using namespace std;
double generateGussianNoise(double mu,double
sigma); //获取高斯随机值
Mat addGaussianNoise(Mat &srcImage);
//为图像添加高斯噪声
int main()
{
//读入图片,注意图片路径
Mat
srcimage=imread('F:\\Matlab\\pictures\\Three.jpg');
cvtColor(srcimage,srcimage,CV_BGR2GRAY);
imshow('srcImage',srcimage);
//图片读入成功与否判定
if(!srcimage.data)
{
cout<<'you idiot!where did you
hide lena!'<<endl;
//等待按键
system('pause');
return -1;
}
Mat resultImage =
addGaussianNoise(srcimage);
imshow('dstImage',resultImage);
//等待按键
waitKey();
return 0;
}
double generateGussianNoise(double mu,double
sigma)
{
const double epsilon
= std::numeric_limits::min();
//区可取范围内的最小值
static double
z0,z1;
static bool flag
= false;
flag = !flag;
double x;
double u1,u2;
if (!flag)
{
return z1*sigma + mu;
}
do{
u1
= (double)rand()/RAND_MAX;
u2
= (double)rand()/RAND_MAX;
}while(u1<=epsilon);
z0 =
sqrt(-2.0*log(u1))*cos(2*CV_PI*u2);
z1 =
sqrt(-2.0*log(u1))*sin(2*CV_PI*u2);
return z0*sigma +
mu;
}
Mat addGaussianNoise(Mat &srcImage)
{
int k =
32;
Mat resultImage =
srcImage.clone();
int nRows =
resultImage.rows;
int nCols =
resultImage.cols;
for (int j=0;j
{
for
(int i=0;i
{
int val =
(int)resultImage.at(j,i) +
k*generateGussianNoise(2,0.8);
if (val<0)
{
val
= 0;
}
if (val>255)
{
val
= 255;
}
resultImage.at(j,i) =
(uchar)val;
}
}
return resultImage;
}
|