噪声
加性噪声一般指热噪声、散弹噪声等,它们与信号的关系是相加,不管有没有信号,噪声都存在。
高斯白噪声包括热噪声和散粒噪声。在通信信道测试和建模中,高斯噪声被用作加性白噪声以产生加性白高斯噪声。
加性高斯白噪声只是白噪声的一种,另有泊松白噪声等,加性高斯白噪声在通信领域中指的是一种各频谱分量服从均匀分布(即白噪声),且幅度服从高斯分布的噪声信号。因其可加性、幅度服从高斯分布且为白噪声的一种而得名。
而乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在。
一般通信中把加性随机性看成是系统的背景噪声;
而乘性随机性看成系统的时变性(如衰落或者多普勒)或者非线性所造成的。
空域滤波
空域滤波可以用于非线性滤波,但是频域滤波不能用于非线性滤波
图像滤波 | ||
---|---|---|
空域 | 线性滤波 | 均值滤波 |
- | - | - |
非线性滤波 | 中值滤波 | |
双边滤波 | ||
滤波模板
图像滤波 模板:
线性平均滤波:
1|0 1 0 |
-|1 1 1 |
5|0 1 0 |
图像锐化 模板:
锐化滤波:图像锐化一般是通过微分运算来实现的
|-1 0 1|
|-1 0 1|
|-1 0 1|
| 1 1 1|
| 0 0 0|
|-1 -1 -1|
方向滤波器-sobel算子
x轴:
|-1 0 1|
|-2 0 2|
|-1 0 1|
y轴:
|-1 -2 -1|
| 0 0 0|
| 1 2 1|
Scharr算子
x轴:
|-3 0 3|
|-10 0 10|
|-3 0 3|
y轴:
|-3 -10 -3|
| 0 0 0|
| 3 10 3|
线性空域滤波
线性空域滤波
指的是像素的输出值是计算该像素邻域内像素值的线性组合
线性滤波中滤波模板也称为卷积模板
模板卷积
模板卷积的主要步骤包括如下几个步骤,
-
将模板在图像中进行遍历,将模板中心和各个像素位置重合;
-
将模板的各个系数与模板对应像素值进行相乘;
-
将所有的乘积相加,并将求和结果赋值于模板中心对应的像素
延拓
模板的行或列就会超出图像之外,因此常常采用延拓的方式解决外边界问题。常用的方法有四种,分别是补零
、重复
、对称
和循环
方式。
补零是指通过补零来扩展图像;
重复是指通过复制外边界的值来扩展图像;
对称是指通过镜像反射外边界的值来扩展图像;
循环是指将图像看成二维周期函数的一个周期来扩展。
均值滤波
高斯滤波
高斯滤波器宽度(决定着平滑程度)是由参数σ表征的,而且σ和平滑程度的关系是非常简单的.σ越大,高斯滤波器的频带就越宽,平滑程度就越好.通过调节平滑程度参数σ
高斯分布: h ( x , y ) = e − ( x 2 + y 2 2 a 2 ) h(x,y)=e^-(\frac{x^2+y^2}{2a^2}) h(x,y)=e−(2a2x2+y2)
双边滤波
一种非线性的滤波方法,是结合图像的空间邻近度
和像素相似度
的的一种折中处理。它是一种保持边缘
的非迭代平滑滤波方法。中心像素的距离和灰度差值的增大,邻域像素的权系数逐渐减小
优点:保持边缘性能良好,对低频信息滤波良好
缺点:不能处理高频信息
假设高斯函数表达式如下:
W
i
j
=
1
K
i
e
−
(
x
j
−
x
i
)
2
σ
G
2
W_ij=\frac{1}{K_i}e^-\frac{(x_j-x_i)^2}{σ^2_G}
Wij=Ki1e−σG2(xj−xi)2
K是归一化的常量,W是权重,权重只跟像素之间的空间距离有关系。
双边滤波器:
W
i
j
=
1
K
i
e
−
(
x
j
−
x
i
)
2
σ
G
2
e
−
(
I
j
−
I
i
)
2
σ
r
2
W_ij=\frac{1}{K_i}e^-\frac{(x_j-x_i)^2}{σ^2_G}e^-\frac{(I_j-I_i)^2}{σ^2_r}
Wij=Ki1e−σG2(xj−xi)2e−σr2(Ij−Ii)2
中值滤波
中值滤波是统计排序滤波的一种,中值滤波对椒盐噪声效果好;滤波图像边缘信息好,边缘清晰
统计排序滤波 | ||
---|---|---|
最大值滤波 | 有效地滤除椒噪声(黑色) | 寻找最亮点,亮化图片 |
最小值滤波 | 有效地滤除盐噪声(白色) | 寻找最暗点,暗化图片 |
自适应中值滤波 | 有效地滤除椒盐噪声 | 钝化图像、去除噪音 |
操作步骤:
-
将模板在图像中遍历
-
将模板对应的邻域内像素的灰度值排序
-
查找中间值,将其赋于模板中心对应的像素
频域滤波
可以用图像增强,首先把图像通过傅里叶变换将图像从空间域转换到频率域,频域处理,反傅里叶变换转到空间域
C++代码
均值滤波
void meanFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)
{
memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );
for (int j=1;j<height-1;j++)
{
for (int i=1;i<width-1;i++)
{
smooth [ j*width+i ] = ( corrupted [ (j-1)*width+(i-1) ] + corrupted [ (j-1)*width+i] + corrupted [ (j-1)*width+(i+1) ] +
corrupted [ j*width+(i-1) ] + corrupted [ j*width+i] + corrupted [ j*width+(i+1) ] +
corrupted [ (j+1)*width+(i-1) ] + corrupted [ (j+1)*width+i] + corrupted [ (j+1)*width+(i+1) ] ) / 9;
}
}
}
中值滤波
void medianFilter (unsigned char* corrupted, unsigned char* smooth, int width, int height)
{
memcpy ( smooth, corrupted, width*height*sizeof(unsigned char) );
for (int j=1;j<height-1;j++)
{
for (int i=1;i<width-1;i++)
{
int k = 0;
unsigned char window[9];
for (int jj = j - 1; jj < j + 2; ++jj)
for (int ii = i - 1; ii < i + 2; ++ii)
window[k++] = corrupted[jj * width + ii];
// Order elements (only half of them)
for (int m = 0; m < 5; ++m)
{
int min = m;
for (int n = m + 1; n < 9; ++n)
if (window[n] < window[min])
min = n;
// Put found minimum element in its place
unsigned char temp = window[m];
window[m] = window[min];
window[min] = temp;
}
smooth[ j*width+i ] = window[4];
}
}
}