Loading

图像滤波

噪声

加性噪声一般指热噪声、散弹噪声等,它们与信号的关系是相加,不管有没有信号,噪声都存在。

高斯白噪声包括热噪声和散粒噪声。在通信信道测试和建模中,高斯噪声被用作加性白噪声以产生加性白高斯噪声。

加性高斯白噪声只是白噪声的一种,另有泊松白噪声等,加性高斯白噪声在通信领域中指的是一种各频谱分量服从均匀分布(即白噪声),且幅度服从高斯分布的噪声信号。因其可加性、幅度服从高斯分布且为白噪声的一种而得名。

而乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,信号在它在,信号不在他也就不在。

一般通信中把加性随机性看成是系统的背景噪声;

而乘性随机性看成系统的时变性(如衰落或者多普勒)或者非线性所造成的。

空域滤波

空域滤波可以用于非线性滤波,但是频域滤波不能用于非线性滤波

图像滤波
空域线性滤波均值滤波
---
非线性滤波中值滤波
双边滤波

滤波模板

图像滤波 模板:


线性平均滤波:
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|

线性空域滤波

线性空域滤波指的是像素的输出值是计算该像素邻域内像素值的线性组合
线性滤波中滤波模板也称为卷积模板

模板卷积

模板卷积的主要步骤包括如下几个步骤,

  1. 将模板在图像中进行遍历,将模板中心和各个像素位置重合;

  2. 将模板的各个系数与模板对应像素值进行相乘;

  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(xjxi)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(xjxi)2eσr2(IjIi)2

中值滤波

中值滤波是统计排序滤波的一种,中值滤波对椒盐噪声效果好;滤波图像边缘信息好,边缘清晰

统计排序滤波
最大值滤波有效地滤除椒噪声(黑色)寻找最亮点,亮化图片
最小值滤波有效地滤除盐噪声(白色)寻找最暗点,暗化图片
自适应中值滤波有效地滤除椒盐噪声钝化图像、去除噪音

操作步骤:

  1. 将模板在图像中遍历

  2. 将模板对应的邻域内像素的灰度值排序

  3. 查找中间值,将其赋于模板中心对应的像素

频域滤波

可以用图像增强,首先把图像通过傅里叶变换将图像从空间域转换到频率域,频域处理,反傅里叶变换转到空间域

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];  
        }  
    }  
} 
posted @ 2019-01-10 16:43  AomanHao  阅读(36)  评论(0)    收藏  举报