滤波,简单来说,就是对图片上的每个像素点和他们周围的若干点组成的集合做运算,从而可以确定每个像素点的新值,然后改变该像素点的值。当对所有像素点都做了相同运算后,可以得到新的图片(这是我自己的理解)。,通过不同的运算可以实现对图像实现不同的效果,具体效果请看下面的讲解。
1. 线性滤波
线性滤波就是用滤波器(算子)对图片的像素点进行线性运算,滤波器是若干个数组成的矩阵,可以用该矩阵对图片上相同数目的像素点做某种运算,从而得到新的图像。线性滤波包括两种运算方式,即相关和卷积:
相关
相关
就是用滤波器的中心元素依次扫描每一个像素点,每经过一个像素点,计算该像素点的值。计算方法为,矩阵的每一个数字和图片上对应位置的数字相乘,然后将这些结果累加,得到该像素点的值,保存到新的图片中。卷积
卷积
与相关
类似,只不过是将相关所用的滤波器 旋转180度 后,再和原图做相关
操作,得到新的图片。
1.1 一维线性滤波
一维线性滤波就是用一维的滤波器,即排列为一行的数字形成的滤波器,进行线性运算,包括相关和卷积,详细操作如下:
对于矩阵:
和滤波器:
相关的操作:
开始时用滤波器的最右边的元素和矩阵的第一个元素相对应,由于矩阵左侧没有数字了,因此在没有数字的位置补 0 进行运算(补充的 0 就是下图第一排的蓝色的 0 ),将和滤波器相对应位置的各位 相乘 后各位得到的值 相加 ,得到的值为与该滤波器中间元素对应的矩阵位置的结果值,然后将滤波器右移,计算下一位,依次类推,直到滤波器的左端元素与矩阵的右端元素重合,得到 相关 操作的结果。
相关的结果为:
由于在做相关操作时,在矩阵两端补了 0 ,因此在得到的结果中,矩阵的元素个数比原来的多了几个,我们称这种结果矩阵为 full 类型的。
相应的称:
这种结果矩阵为 same 类型的,代表大小和原矩阵相同。
卷积的操作:
卷积只是将滤波器旋转 180 度,之后的操作和相关完全相同,见下图。
类似于相关,称:
为 full 类型的结果。
称:
为 same 类型的结果。
例子:
对于
1.2 一维线性滤波的matlab实现
代码:
g = imfilter(f, w, filtering_mode, size_options);
f 代表要进行滤波的矩阵
w 代表滤波器
filtering_mode 代表滤波模式,取值包括 corr (相关,默认值),和 conv (卷积)。
size_options 代表操作类型,取值包括 same ( same 类型操作,默认值),和 full ( full 类型操作) 。
在命令行中的操作如下:
1.3 二维线性滤波
二维线性滤波就是用 n × n \boldsymbol{n\times n} n×n 个数字组成的二维滤波器,在图中进行运算。对于二维线性滤波,操作所用函数和一维的并无变化,只需传入二维滤波器作为参数。
设二维滤波器:
矩阵为:
进行二维滤波的相关运算为:
首先用滤波器的右下角元素与矩阵左上角元素相对应,然后,对矩阵外圈补 0 ,使得得到的新矩阵可以从左上角和滤波器刚好对应(如下图),然后将滤波器的每个元素和新矩阵对应位置的元素的值相乘之后累加,得到新的矩阵的第一个值。然后将滤波器右移一位,再次计算第二个值,依次类推,当将滤波器的左上角移动到和原矩阵右下角重合时停止,得到结果矩阵。
最后得到结果矩阵:
因为该矩阵大小和原矩阵不同,因此称该矩阵为 full 类型结果矩阵。
相应的称:
为 same 类型的结果矩阵。
以上操作在命令行表示为:
进行二维滤波的卷积运算为:
卷积运算只是将滤波器进行旋转 180 度,然后按照相关的操作,在矩阵中做运算,对于以上矩阵和滤波器做 卷积 操作的运算结果为
1.4 均值滤波器
形如:
这些类型的称为 均值滤波器 ,均值滤波器的特点为,滤波器和图像做完运算后,得到的结果要除以滤波器所有元素的累加和。(也可以理解为先用滤波器每个元素除以它们的累加和,再去和图像做运算。这两种方法相等,原理很简单,大家应该可以想明白。)
均值滤波器的特点: 利用均值滤波器和图像做运算,可以使图像更加平缓,变得模糊。
下图展示可以看出均值滤波器的效果:
可以看出图片整体偏向模糊,不同颜色过渡地方颜色变化变小。(可以在网页放大查看,或运行下方代码查看,可以更加容易比较。图片资源在文章末尾。)
代码:
clear,clc,close all;
f=imread('mount.jpg');
subplot(1,2,1),imshow('mount.jpg'),title('原图');
w=[1 2 3;
4 5 6;
7 8 9]/45;
fi=imfilter(f,w);
subplot(1,2,2),imshow(fi),title('均值滤波器');
1.5 低通滤波器
对于这些均值滤波器:
这些类型的滤波器,称为 对称临近均值滤波器,他们的特点为成中心对称。这些滤波器又被归类为 低通滤波器,这一类的均值滤波器和部分低通滤波器相同。
低通滤波器在图像处理中的作用是基本保持变化率较少的像素点(低频)的值,而使变化率较高的像素点(高频)的值减弱,使图片更加平滑,可以模糊图片的明暗边界。
低通过滤器所有元素的累加值应该为 1,这就能保留图像的亮度,确保图像不会变亮或变暗。(以上的描述都是我自己的理解,比较清楚的老铁可以帮我审查一下,看看有没有错误。)
通过下图可以看出,该滤波器的效果和均值滤波器相似。
代码:
clear,clc,close all;
f=imread('mount.jpg');
subplot(1,2,1),imshow('mount.jpg'),title('原图');
w=[1 2 1;
2 4 2;
1 2 1]/16;
fi=imfilter(f,w);
subplot(1,2,2),imshow(fi),title('均值滤波器');
1.6 高通滤波器
形如以下滤波器:
称为 高通滤波器 ,高通滤波器就是增强变化率较大的像素点(高频)的值,减弱变化率较小的像素点(低频)的值,从而可以实现锐化图片,使图片不同颜色变化的边界更加明显。
效果见下图:可以看出图片不同颜色的边界更加明显,图片锐化。
代码:
clear,clc,close all;
f=imread('mount.jpg');
subplot(1,2,1),imshow('mount.jpg'),title('原图');
w=[0 -1 0;
-1 5 -1;
0 -1 0];
fi=imfilter(f,w);
subplot(1,2,2),imshow(fi),title('高通滤波器');
1.7 边缘提取滤波器
形如:
的滤波器称为 边缘提取滤波器,边缘提取滤波器的元素累加和为 0,可以提取出来不同颜色之间的边界。
效果如下:
代码:
clear,clc,close all;
f=imread('lena.png');
subplot(1,2,1),imshow(f),title('原图');
w=[-1 -1 -1;
-1 8 -1;
-1 -1 -1];
fi=imfilter(f,w);
subplot(1,2,2),imshow(fi),title('边缘提取滤波器');
1.8 生成滤波器
在matlab中提供了函数以生成不同类型的滤波器,函数如下:
w = fspecial('type', param);
type 表示滤波器类型,取值包括 average, disk, gaussian, laplacian …
param 表示该种滤波器所需的详细参数
该函数各中类型滤波器的区别和所需参数可以在 matlab 中查看帮助文档详细了解。
下图演示了用函数生成一个滤波器,并对图片做运算的操作。
代码:
clear,clc,close all;
f=imread('lena.png');
subplot(1,2,1),imshow(f),title('原图');
w=fspecial('prewitt');
fi=imfilter(f,w);
subplot(1,2,2),imshow(fi),title('函数生成滤波器');
2. 图片资源