图像滤波

噪声

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

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

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

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

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

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

空域滤波

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

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

滤波模板

图像滤波 模板:


线性平均滤波:
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^-(\frac{x^2+y^2}{2a^2})$

双边滤波

一种非线性的滤波方法,是结合图像的空间邻近度像素相似度的的一种折中处理。它是一种保持边缘的非迭代平滑滤波方法。中心像素的距离和灰度差值的增大,邻域像素的权系数逐渐减小

优点:保持边缘性能良好,对低频信息滤波良好

缺点:不能处理高频信息

假设高斯函数表达式如下:
$$W_ij=\frac{1}{K_i}e^-\frac{(x_j-x_i)^2}{σ^2_G}$$

K是归一化的常量,W是权重,权重只跟像素之间的空间距离有关系。

双边滤波器:
$$W_ij=\frac{1}{K_i}e^-\frac{(x_j-x_i)^2}{σ^2_G}e^-\frac{(I_j-I_i)^2}{σ^2_r}$$

中值滤波

中值滤波是统计排序滤波的一种,中值滤波对椒盐噪声效果好;滤波图像边缘信息好,边缘清晰
|统计排序滤波|||
|-|-|-|
|最大值滤波|有效地滤除椒噪声(黑色)|寻找最亮点,亮化图片|
|最小值滤波|有效地滤除盐噪声(白色)|寻找最暗点,暗化图片|
|自适应中值滤波|有效地滤除椒盐噪声|钝化图像、去除噪音|

操作步骤:

1) 将模板在图像中遍历

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

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

Matlab函数

Matlab滤波相关函数主要有imfilter()fspecial()

imfilter()是滤波操作

fspecial()是构建自定义的二维滤波器,供imfilter()函数使用

imfilter()函数

定义 g = imfilter(f, w, option1, option2, ...)

其中:

f:待滤波图像
w:滤波模板
option1, option2:可选项

可选项分为:

(1) 边界项:遍历处理边界元素时,需要提前在图像边界周围补充元素

 参数:`X`--表示具体的数字,默认用`0`补充
  `symmetric`--镜像边界元素
  `replicate`--重复边界像素
  `circular`--周期性填充边界内容

(2) 尺寸项:处理图像前扩充了边界,比原图大一圈,此项输出图像大小
参数: same--输出图像输入图像尺寸相同
full--输出图像与扩充边界的图像尺寸相同,即比原图大一圈
(3) 模式项:滤波过程选择
参数:corr--相关滤波过程
conv--卷积相关过程
(4)

fspecial()函数

定义 h = fspecial(type, parameters)

其中:

type:滤波类型

参数:average--平均模板
disk--圆形邻域平均模板
guassian--高斯模板
laplacian--拉普拉斯模板
log--高斯-拉普拉斯模板
prewitt--prewitt水平边缘检测算子
sobel--Sobel水平边缘检测算子


频域滤波

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

||||
|-|-|-|
||||

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];  
        }  
    }  
} 
最后修改:2020 年 07 月 07 日
如果觉得我的文章对你有用,请随意赞赏