Harris-Laplace检测子原理及实现

Harris-Laplace检测子原理及实现

1. 原理

Harris 角点检测虽然对于光照强度、旋转角度改变具有较好的检测不变性,但是却不具有尺度不变性及仿射不变性,然后在现实生活中,两张图片中目标物体发生尺度变化,或由视点变化而引起仿射变化是非常常见的。为了获得尺度不变性,比较直观的方法就是建立多尺度空间,对于每个特征位置都有在不同尺度下的表示,那么在匹配时只要找到对应尺度空间下的特征点就可以了。所以我们只需要在经典的方法里引入多尺度空间,在原特征点空间里增加了多个其他尺度空间的特征点,这些增加的特征点对应于不同的尺度空间的图像,增加了目标尺度变化的鲁棒性,使其具有了一定程度的尺度不变性。由此的新的二阶矩 M(x,y) M ( x , y )
可以表示为:

M(x,y)=σ2Dg(σ1)[L2x(x,σD)LxLy(x,σD)LxLy(x,σD)L2y(x,σD)](1) (1) M ( x , y ) = σ D 2 g ( σ 1 ) ∗ [ L x 2 ( x , σ D ) L x L y ( x , σ D ) L x L y ( x , σ D ) L y 2 ( x , σ D ) ]

新的 M(x,y) M ( x , y ) 同原来相比增加了两个高斯尺度参数(称为积分尺度,它是决定Harris 角点当前尺度的变量,其越大说明对于尺度越大,有放大效果,为微分尺度或局部尺度,它是决定角点附近微分值变化的变量,实际上可以认为是一个高斯平滑参数,滤除 Laplace 变换后形成的细小噪声点),另外原来的梯度运算变成了 LoG 算子。
然而应用多尺度空间后,会增加大量的特征点,然而特征点的增加会提高误检测的概率及计算复杂度,另外尺度空间的变化并不是连续的,尺度空间变化间隔越少,那么最后匹配的尺度参数与实际尺度的误差越少。基于这个原因,论文作者提出了自适应尺度选择的 Harris 角点检测方法。
自适应尺度选择的 Harris 角点检测方法主要是找到局部的结构最显著的尺度,只需要确定一个显著尺度的特征点,而不需要要原来多个尺度来表示,那么在匹配时只需要将两副图片里目标点分别变换到其显著尺度下,进行匹配就可以了。这里的最显著尺度的衡量是根据所选择的点对应不同尺度 LoG 响应程度,选择出响应程度最大的尺度(这里的尺度实际上指的是LoG的模板半径,由 σ σ 来确定,窗口半径为 3σ 3 ∗ σ ,即窗口参数)。衡量公式如下:
|LoG(x,σn)|=σ2n|Lxx(x,σn)+Lyy(x,σn)|(2) (2) | L o G ( x , σ n ) | = σ n 2 | L x x ( x , σ n ) + L y y ( x , σ n ) |

我们需要找到具有最显著尺度的点和其显著尺度,原文给我们介绍了两种方法,一种是精确的迭代方法,另一种权衡了精确度及计算效率的简化方法:

  1. 精确的迭代方法:
    第一步:取 σ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
    第二步:针对每个初始点xX 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 ) 时就可以停止搜索,否则转到第二步继续迭代。

  2. 简化方法:首先同精确迭代算法第一步一样,建立 Harris 函数的多尺度空间,然后计算每个尺度里的局部 cornerness 角程度最大值,作为初始点;然后验证每一个初始点在LoG在尺度空间是否是极值点,不是极值点则删除。

2. 代码

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

3. 效果

Harris-Laplace检测子原理及实现_第1张图片

你可能感兴趣的:(特征检测,Matlab,特征检测)