用法: B = imfilter(A,H)
B = imfilter(A,H,option1,option2,…)
或写作 g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中, f 为输入图像, w 为滤波掩模, g 为滤波后图像。 filtering_mode 用于指定在滤波过程中是使用“相关”还是“卷积”。 boundary_options 用于处理边界充零问题,边界的大小由滤波器的大小确定。具体参数选项见下表:
选项 | 描述 | |
filtering_mode | ‘corr’ | 通过使用相关来完成,该值为默认。 |
‘conv’ | 通过使用卷积来完成 | |
boundary_options | ‘X’ | 输入图像的边界通过用值X(无引号)来填充扩展 其默认值为0 |
‘replicate’ | 图像大小通过复制外边界的值来扩展 | |
‘symmetric’ | 图像大小通过镜像反射其边界来扩展 | |
‘circular’ | 图像大小通过将图像看成是一个二维周期函数的一个周期来扩展 | |
size_options | ‘full’ | 输出图像的大小与被扩展图像的大小相同 |
‘same’ | 输出图像的大小与输入图像的大小相同。这可通过将滤波掩模的中心点的偏移限制到原图像中包含的点来实现,该值为默认值。 |
这里讨论利用输入图像中像素的小邻域来产生输出图像的方法,在信号处理中这种方法称为滤波(filtering)。其中,最常用的是线性滤波:输出像素是输入邻域像素的加权和。
imfilter函数操作说明
一维相关与卷积
图2-1(a)显示了一维函数f和模板w。假设f的原点定为最左侧的点。为执行两个函数的相关,可移动w使其最右侧的点与f的原点重合,如图2-1(b)所示。需要注意的是,这两个函数之间有一些点未重叠。为处理该问题,最普遍的方法是在f中填充足够多的0(对应表1-1中边界选项boundary_options的默认值P),以保证在w通过f的整个过程中,始终存在对应的点。如图2-1(c)所示。
现在准备执行相关操作。相关操作结果第一个值是在图2-1(c)所示位置上两个函数对应位置乘积的累加和。接着将w向右移动一个位置并重复上述过程,如图2-1(d)所示。经过4次移动后,如图2-1(e)所示。以此类推,直至w全部通过f,最终得到如图2-1(f)所示。得到的w与f的相关如图2-1(g)所示。
在图2-1(g)所示的相关中,符号’full’是由MATLAB图像处理工具箱使用的标记,用来指示相关操作按上述方式计算时使用了经过充零后的图像。同样,工具箱还提供了另一个’same’选项,可以产生大小与f相同的相关。这种计算同样也使用经过充零后的图像,但开始位置位于与f的原点对准的模板的中线点。最后的计算时使f的最后一个点与模板的中心点对准。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/c0961d8c71726eef55ff800d9c3f53d3.png)
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/1d4d25a1cb681208e382afe622d67088.png)
为了执行卷积,将w旋转180度,使其最右侧的点与f的原点重叠,如图2-2(b)所示。然后重复在相关操作中使用的滑动计算过程,如图2-2(c)到图2-2(f)所示。’full’和’same’卷积结果分别如图2-2(g)和图2-2(h)所示。
二维相关与卷积
上述情况很容易推广到二维图像中,如图2-3所示。原点位于图像f(x,y)的左上角。为了执行相关计算,设置w(x,y)的最右下角点,使之与f(x,y)的原点重合,如图2-3(c)所示。与一维情况类似,这里我们使用了零填充。然后在所有可能的位置上移动w(x,y),使得它的至少一个像素会与原始图像f(x,y)中的某个像素重叠。这个’full’相关的结果如图2-3(d)所示。为得到图2-3(e)中所示的’same’相关,我们要求w(x,y)的所有偏移都能实现中心像素覆盖原始的f(x,y)。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/8585a2b5913077f6cff990831302db69.png)
对于卷积,我们将w(x,y)旋转180度,其他处理方式与相关操作相同,参见图2-4(a)到图2-4(c)。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/2c929b616b0fce8d74d31d5031e630aa.png)
1.相关算子(Correlation Operator)
步骤:
1)滑动核,使其中心位于输入图像g的(i,j)像素上
2)利用上式求和,得到输出图像的(i,j)像素值
3)充分上面操纵,直到求出输出图像的所有像素值
例:
A = [17 24 1 8 15 h = [8 1 6
23 5 7 14 16 3 5 7
4 6 13 20 22 4 9 2]
10 12 19 21 3
11 18 25 2 9]Matlab 函数:imfilter(A,h)
2.卷积算子(Convolution)【为什么要卷积?】
步骤:
1)将核围绕中心旋转180度
2)滑动核,使其中心位于输入图像g的(i,j)像素上
3)利用上式求和,得到输出图像的(i,j)像素值
4)充分上面操纵,直到求出输出图像的所有像素值
Matlab 函数:Matlab 函数:imfilter(A,h,’conv’)% imfilter默认是相关算子,因此当进行卷积计算时需要传入参数’conv’
3.边缘效应
当对图像边缘的进行滤波时,核的一部分会位于图像边缘外面。
常用的策略包括:
1)使用常数填充:imfilter默认用0填充,这会造成处理后的图像边缘是黑色的。
2)复制边缘像素:I3 = imfilter(I,h,’replicate’);
4.常用滤波
fspecial函数(查matlab)可以生成几种定义好的滤波器的相关算子的核。
【例-1】unsharp masking 滤波
12345I = imread(
'moon.tif'
);
h = fspecial(
'unsharp'
);
I2 = imfilter(I,h);
imshow(I), title(
'Original Image'
)
figure, imshow(I2), title(
'Filtered Image'
)
对于图像来说,高斯滤波器是利用高斯核的一个2维的卷积算子,用于图像模糊化(去除细节和噪声)。
1. 高斯分布
一维高斯分布
二维高斯分布
2.高斯核
理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。 如下图为一个标准差为1.0的整数值高斯核。
3. 高斯滤波(平滑)
完成了高斯核的构造后,高斯滤波就是用此核来执行标准的卷积。
4.应用
高斯滤波后图像被平滑的程度取决于标准差。它的输出是领域像素的加权平均,同时离中心越近的像素权重越高。因此,相对于均值滤波(mean filter)它的平滑效果更柔和,而且边缘保留的也更好。
高斯滤波被用作为平滑滤波器的本质原因是因为它是一个低通滤波器,见下图。而且,大部份基于卷积平滑滤波器都是低通滤波器。
图.高斯滤波器(标准差=3像素)的频率响应。The spatial frequency axis is marked in cycles per pixel,
and hence no value above 0.5 has a real meaning。
Matlab函数:h = fspecial(‘gaussian’, hsize, sigma) returns a rotationally symmetric Gaussian lowpass filter of size hsize with standard deviation sigma (positive). hsize can be a vector specifying the number of rows and columns in h, or it can be a scalar, in which case h is a square matrix.
The default value for hsize is [3 3]; the default value for sigma is 0.5.
【例-3】Laplacian滤波
更复杂些的滤波算子一般是先利用高斯滤波来平滑,然后计算其1阶和2阶微分。由于它们滤除高频和低频,因此称为带通滤波器(band-pass filters)。
在介绍具体的带通滤波器前,先介绍必备的图像微分知识。
1 一阶导数
对于离散情况(图像),其导数必须用差分方差来近似,有
,前向差分 forward differencing (1.2)
,中心差分 central differencing (1.3)
代码实现:http://www.cnblogs.com/pegasus/archive/2011/05/20/2051780.html
实例:技术图像x方向导数
12I = imread(
'coins.png'
); figure; imshow(I);
Id = mipforwarddiff(I,
'dx'
); figure, imshow(Id);
原图像 x方向1阶导数
2 图像梯度(Image Gradient)
图像I的梯度定义为 ,其幅值为
。出于计算性能考虑,幅值也可用
来近似。
Matlab函数
1)gradient:梯度计算
2)quiver:以箭头形状绘制梯度。注意放大下面最右侧图可看到箭头,由于这里计算横竖两个方向的梯度,因此箭头方向都是水平或垂直的。
实例:仍采用上面的原始图像
12345I =
double
(imread(
'coins.png'
));
[dx,dy]=gradient(I);
magnitudeI=sqrt(dx.^2+dy.^2);
figure;imagesc(magnitudeI);colormap(gray);%梯度幅值
hold on;quiver(dx,dy);%叠加梯度方向
梯度幅值 梯度幅值+梯度方向
3 二阶导数
3.1 普拉斯算子(laplacian operator)
3.1.2 概念
拉普拉斯算子是n维欧式空间的一个二阶微分算子。它定义为两个梯度向量算子的内积
其在二维空间上的公式为: (3.3)
对于1维离散情况,其二阶导数变为二阶差分
2)因此,二阶差分为
对于2维离散情况(图像),拉普拉斯算子是2个维上二阶差分的和(见式3.3),其公式为:
上式对应的卷积核为
常用的拉普拉斯核有:
3.1.2 应用
拉普拉斯算子会突出像素值快速变化的区域,因此常用于边缘检测。
Matlab里有两个函数
1)del2
2)fspecial:图像处理中一般利用Matlab函数fspecial
h = fspecial(‘laplacian’, alpha) returns a 3-by-3 filter approximating the shape of the two-dimensional Laplacian operator.
The parameter alpha controls the shape of the Laplacian and must be in the range 0.0 to 1.0. The default value for alpha is 0.2.
3.1.3 资源
http://fourier.eng.hmc.edu/e161/lectures/gradient/node8.html (非常清晰的Laplacian Operator介绍,本文的主要参考)