转自:imfilter函数
1 imfilter函数简介
函数名称:imfilter
函数语法:g=imfilter(f,w,filtering_mode,boundary_options,size_optinos)
函数功能:对任意类型数组或多维图像进行滤波
参数介绍:f是输入图像,w为滤波模板,g为滤波结果;表1-1总结了其他参数的含义。
表1-1 imfilter函数的选项
操作说明:在执行线性空间滤波函数imfilter时,我们必须清晰的理解两个意义相近的概念。一个是相关 (corr);另一个是卷积(conv)。下面分别介绍一维函数和二维函数在模板w下的相关操作和卷积操作。
2 imfilter函数操作说明
2.1 一维相关与卷积
图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的最后一个点与模板的中心点对准。
图2-1 一维相关操作说明
图2-2 一维卷积操作说明
为了执行卷积,将w旋转180度,使其最右侧的点与f的原点重叠,如图2-2(b)所示。然后重复在相关操作中使用的滑动计算过程,如图2-2(c)到图2-2(f)所示。’full’和’same’卷积结果分别如图2-2(g)和图2-2(h)所示。
2.2 二维相关与卷积
上述情况很容易推广到二维图像中,如图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)。
图2-3 二维相关操作示例
对于卷积,我们将w(x,y)旋转180度,其他处理方式与相关操作相同,参见图2-4(a)到图2-4(c)。
图2-4二维卷积操作示例
转自:Matlab图像处理学习笔记(五):Harris角点检测
本文将从Harries角点检测的原理出发,讲述怎么用matlab一步步实现Harris角点检测算法。
matlab可以用corner直接调用Harris角点检测算法,但为了学习如何提取特征点,本文用matlab将其实现,纯粹出于学习目的。由于harris角点特征点相对比较简单,容易实现,这位学习别的特征点检测打下基础。程序中出现的定常数均采用Matlab中corner实现该算法时的默认值。
在实现的过程中,主要是参考了Chris Harris & Mike Stephens在1988年发表的那篇文章A COMBINED CORNER AND EDGE DETECTOR。
本文一部分图像及公式来源于百度文库的一篇PPT:Harris角点检测,可自行检索获得。
转载请注明出处:http://blog.csdn.net/u010278305
本文涉及到的知识点如下:
1、高斯卷积。
2、Harris角点检测。
程序设计流程如下:
1、先将论文涉及该算法的主要部分给出截图:
设计程序时,首先要完成论文的这一部分,计算出A、B、C。
2、运用高斯窗对其进行滤波。
高斯函数如下:
用matlab生成一个高斯卷积核的方法:
h=fspecial('gaussian',[5 1],1.5);
w=h*h';
3、遍历图像的每一点,求其M矩阵,并计算出R(之后用于判断是否是角点)。
M矩阵为:
R的计算方法为:
4、判断是否是角点。
如果R大于0且大于Q*RMax,则认为它是角点,RMax为R的最大值,Q为一个常数系数。
5、对角点进行筛选。只有在8邻域内是最大值的店才会被认为是角点。
下面给出源代码:
%function:
% Harris角点检测
%注意:
% matlab自带的corner函数即可实现harris角点检测。但考虑到harris角点的经典性,本程序将其实现,纯粹出于学习目的,了解特征点检测的方法。
% 其中所有参数均与matlab默认保持一致
%referrence:
% Chris Harris & Mike Stephens,A COMBINED CORNER AND EDGE DETECTOR
%date:2015-1-11
%author:chenyanan
%转载请注明出处:http://blog.csdn.net/u010278305
%清空变量,读取图像
clear;close all
src= imread('images/girl.jpg');
gray=rgb2gray(src);
gray = im2double(gray);
%缩放图像,减少运算时间
gray = imresize(gray, 0.2);
%计算X方向和Y方向的梯度及其平方
X=imfilter(gray,[-1 0 1]);
X2=X.^2;
Y=imfilter(gray,[-1 0 1]');
Y2=Y.^2;
XY=X.*Y;
%生成高斯卷积核,对X2、Y2、XY进行平滑
h=fspecial('gaussian',[5 1],1.5);
w=h*h';
A=imfilter(X2,w);
B=imfilter(Y2,w);
C=imfilter(XY,w);
%k一般取值0.04-0.06
k=0.04;
RMax=0;
size=size(gray);
height=size(1);
width=size(2);
R=zeros(height,width);
for h=1:height
for w=1:width
%计算M矩阵
M=[A(h,w) C(h,w);C(h,w) B(h,w)];
%计算R用于判断是否是边缘
R(h,w)=det(M) - k*(trace(M))^2;
%获得R的最大值,之后用于确定判断角点的阈值
if(R(h,w)>RMax)
RMax=R(h,w);
end
end
end
%用Q*RMax作为阈值,判断一个点是不是角点
Q=0.01;
R_corner=(R>=(Q*RMax)).*R;
%寻找3x3邻域内的最大值,只有一个交点在8邻域内是该邻域的最大点时,才认为该点是角点
fun = @(x) max(x(:));
R_localMax = nlfilter(R,[3 3],fun);
%寻找既满足角点阈值,又在其8邻域内是最大值点的点作为角点
%注意:需要剔除边缘点
[row,col]=find(R_localMax(2:height-1,2:width-1)==R_corner(2:height-1,2:width-1));
%绘制提取到的角点
figure('name','Result');
subplot(1,2,1),imshow(gray),title('my-Harris'),
hold on
plot(col,row, 'b*'),
hold off
%用matlab自带的edge函数提取Harris角点,对比效果
C = corner(gray);
subplot(1,2,2),imshow(gray),title('matlab-conner'),
hold on
plot(C(:,1), C(:,2), 'r*');
hold off
下面给出本程序运行效果与matlab的corner运行效果的对比图: