Harris 角点检测虽然对于光照强度、旋转角度改变具有较好的检测不变性,但是却不具有尺度不变性及仿射不变性,然后在现实生活中,两张图片中目标物体发生尺度变化,或由视点变化而引起仿射变化是非常常见的。为了获得尺度不变性,比较直观的方法就是建立多尺度空间,对于每个特征位置都有在不同尺度下的表示,那么在匹配时只要找到对应尺度空间下的特征点就可以了。所以我们只需要在经典的方法里引入多尺度空间,在原特征点空间里增加了多个其他尺度空间的特征点,这些增加的特征点对应于不同的尺度空间的图像,增加了目标尺度变化的鲁棒性,使其具有了一定程度的尺度不变性。由此的新的二阶矩 M(x,y) M ( x , y )
可以表示为:
我们需要找到具有最显著尺度的点和其显著尺度,原文给我们介绍了两种方法,一种是精确的迭代方法,另一种权衡了精确度及计算效率的简化方法:
精确的迭代方法:
第一步:取 σn=knσ0(k=1.4,n=1,2,3,...,N),σD=sσn(s=0.7) σ n = k n σ 0 ( k = 1.4 , n = 1 , 2 , 3 , . . . , N ) , σ D = s σ n ( s = 0.7 ) , 在尺度空间寻找各个尺度层的角点,得到初始点集 X X 。
第二步:针对每个初始点x∈X x ∈ X ,在尺度空间 σ(k+1)n=tσ(k)n,t∈[0.7,1.4] σ n ( k + 1 ) = t σ n ( k ) , t ∈ [ 0.7 , 1.4 ] 寻找 |LoG(x(k),σ(k+1)n)| | L o G ( x ( k ) , σ n ( k + 1 ) ) | 的极值点所对应的尺度 σ(k+1)n σ n ( k + 1 ) 。如果不存在极值点,则舍弃该点,退出循环,继续评估点集 X X 中的下一个点。若存在极值点,则在σ(k+1)n σ n ( k + 1 ) 的尺度层按8领域寻找最大的Harris响应极值点,范围为以 x(k) x ( k ) 为圆心, σ(k+1)n σ n ( k + 1 ) 为半径的圆域。
第三步:当该点的尺度和空间位置都不再变化,即 σ(k+1)n=σ(k)n,x(k+1)=x(k) σ n ( k + 1 ) = σ n ( k ) , x ( k + 1 ) = x ( k ) 时就可以停止搜索,否则转到第二步继续迭代。
简化方法:首先同精确迭代算法第一步一样,建立 Harris 函数的多尺度空间,然后计算每个尺度里的局部 cornerness 角程度最大值,作为初始点;然后验证每一个初始点在LoG在尺度空间是否是极值点,不是极值点则删除。
matlab实现
%/
%功能:实现Harris-Laplacian角点检测算法,此为简化算法
%
% 用法: [features,imp] = detect_features_Har_Lap(img, sigma)
% 参数:
%
% img : 输入图像
% sigma: 初始尺度空间方差
% Returns:
%
% features - matrix with one row for each feature, containing:
% [x position in original image, y position in original
% image, scale(sub-level)]
%
%
%张建达
%/
function feature = detect_features_Har_Lap(imge, sigma)
close all;
img=rgb2gray(imge);
N = floor(min(log(2*size(img)/12)/log(sigma)))
%首先对图像进行高斯模糊,去噪
G = fspecial('gaussian',9 ,3);
im = imfilter(img,G,'replicate');
t = 1;
[height, width] = size(im);
R = zeros(height,width,N);
LoG = zeros(height,width,N);
%imp = zeros(height,width,N);
harpoints=zeros(0,3);
for i = 1:N
sigma_I = t*sigma;
k_size = floor(6*sigma_I+1)
%[R{i}, imp{i}] = get_LoG_imp(im, 0.06, k_size, sigma_I);
I=double(im);
%%计算xy高斯加权方向梯度%%
sigma_D = 0.7*sigma_I;%经验值0.7
g = sum(fspecial('gaussian', 3 ,sigma_D));%一维高斯卷积核
fx = [-1,0,1];%x方向梯度模板
Ix = filter2(g.*fx, I);%高斯加权x方向滤波
fy = [-1;0;1];%y方向梯度模板(注意是分号)
Iy = filter2(g'.*fy, I);%高斯加权y方向滤波
%%计算两个方向梯度的乘积%%%
Ix2=Ix.^2;
Iy2=Iy.^2;
Ixy=Ix.*Iy;
%%使用高斯加权函数对梯度乘积进行加权%%
h=fspecial('gaussian',k_size ,sigma_I);
%h = h * sigma_D^2;
IX2=filter2(h,Ix2);
IY2=filter2(h,Iy2);
IXY=filter2(h,Ixy);
%%计算每个像元的Harris响应值%%
%像素(i,j)处的Harris响应值
for m=1:height
for n=1:width
M=[IX2(m,n) IXY(m,n);IXY(m,n) IY2(m,n)];
R(m,n,i)=det(M)-0.06*(trace(M))^2;
end
end
Rmax=max(max(R(:,:,i)));
%%阈值%%
tmp=0.01*Rmax;
for m=1:height
for n=1:width
if R(m,n,i)i)=0;
end
end
end
%%进行3*3领域非极大值抑制%%
corner_peaks=imregionalmax(R(:,:,i));
num = sum(sum(corner_peaks))
[posr,posc]=find(corner_peaks==1);
% figure
% imshow(im);
% hold on
% for j=1:length(posr)
% plot(posc(j),posr(j),'r+');
% end
harpoints(end+1:end+length(posr),:) = [posr,posc,i*ones(size(posr))];
%计算LoG尺度空间
LoG(:,:,i)=sigma_I*sigma_I*imfilter(img,fspecial('log', k_size, sigma_I),'replicate');
imp{i}=imfilter(img,fspecial('gaussian', k_size, sigma_I),'replicate');
t = 1.4*t;
end
% 检测每个特征点在某一尺度LoG响应是否达到最大
n = size(harpoints,1);
cpt = 0;
feature_t = zeros(n,3);
for i=1:n
c = harpoints(i,1);
s = harpoints(i,2);
l = harpoints(i,3);
val = LoG(c,s,l);
tmp=1;
for z=l-1:l+1
if z>N
z = N;
end
if z<1
z = 1;
end
for x=c-1:c+1
for y=s-1:s+1
if x>height
x = x-1;
end
if y>width
y = y-1;
end
if x<1
x = x+1;
end
if y<1
y = y+1;
end
if val < LoG(x,y,z);
tmp = 0;
end
end
end
end
if tmp==1
cpt=cpt+1;
feature_t(cpt,:)=[harpoints(i,:)];
%feature(cpt,3)=sigma*1.4^harpoints(i,3);
end
end
feature = zeros(cpt,3);
for i = 1:cpt
feature(i,:)=feature_t(i,:);
end
figure
imshow(imge);
hold on
for i=1:length(feature)
plot(feature(i,2),feature(i,1),'r+');
theta = 0:0.1:2*pi;
rad = sigma*1.4^feature(i,3);
c_x=feature(i,2)+rad*cos(theta);
c_y=feature(i,1)+rad*sin(theta);
plot(c_x,c_y,'r-');
end
end