欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Harris角点检测

程序员文章站 2022-06-11 16:55:46
...

haaris角点检测在一个或者是两个相机进行标定的时候常常用到,Opencv和matlab中都有现成的命令和程序。

角点的位置就是图像中在x和y方向变化都很大的那个交点处。为了找到那些角点需要进行以下步骤的计算。

Harris角点检测

 一、获取输入图像image的x和y方向的边缘图像。

      方法是,用x和y方向的一阶滤波算子dx和dy(或者是二阶滤波算子dx和dy)对图像进行滤波。

      其中x方向的一阶滤波算子一般取为dx=[-1,0,1];x方向的二阶滤波算子一般取为dx=[--2,1,0,1,2];

             y方向的一阶滤波算子一般取为dy=[-1;0;1];y方向的二阶滤波算子一般取为dy=[--2;1;0;1;2];

       滤波函数用filter2(),边缘图像Ix=filter2(dx,image);Iy=filter2(dy,image);其中dx,dy为滤波算子,image为要进行滤波的图像.

二、计算角点量。

初始化角点量,并进行离散高斯滤波。

Harris角点检测

并用高斯算子对M进行二维离散滤波,高斯算子如下:

Harris角点检测

 

高斯算子通过gauss=fspecial('gaussian',[5 5],2)设置[5 5]为算子窗口大小,2为算子的:

gauss =

    0.0232    0.0338    0.0383    0.0338    0.0232
    0.0338    0.0492    0.0558    0.0492    0.0338
    0.0383    0.0558    0.0632    0.0558    0.0383
    0.0338    0.0492    0.0558    0.0492    0.0338
    0.0232    0.0338    0.0383    0.0338    0.0232

滤波是对图像每个像素点对应的M中各个元素进行滤波:


Ix2=filter2(gauss,Ix2);
Iy2=filter2(gauss,Iy2);
Ixy=filter2(gauss,Ixy);

然后计算各个像素点的角点量R,R为正值是,检测到的是角点,R为负时检测到的是边,R很小时检测到的是平坦区域:

Harris角点检测

或者

Harris角点检测

其中k取0.04~0.06常用

三、获取全局最大角点量值,设置阈值,并求局部最大角点量值也即进行非最大值抑制。

Rmax= max(R(i,j))

阈值thresh=th*Rmax,th取值越大角点越少,th越小角点越多。

非最大值抑制的方法是,取窗口内最大值,窗口可取3x3大小。

四、在图片上画出角点位置。当R(i,j)大于阈值且是局部最大值时就认为是角点处。

以上摘自该篇博客:https://blog.csdn.net/x_r_su/article/details/52680712

原图像为:

Harris角点检测

x方向滤波后边缘图像为:

Harris角点检测

y方向滤波后边缘图像为:

Harris角点检测

找到的角点图像为:

Harris角点检测

 matlab实现Harris角点检测:

image=imread('9.jpg');  
channel=size(image,3);  
height=size(image,1);  
width=size(image,2);  
if channel==3;  
    image=rgb2gray(image);  
end  
image=double(image);  
figure; imshow(image,[]); title('原图'); 
  
%求x和y方向的梯度图 
% dx=[-1,0,1];%横向梯度算子  
% dy=[-1;0;1];%纵向梯度算子  
dx=[-1,0,1];%横向梯度算子  
dy=[-1;0;1];%纵向梯度算子  
Ix=zeros(height,width);  
Iy=zeros(height,width);  
Ix=filter2(dx,image);  
Iy=filter2(dy,image);  
figure;imshow(uint8(Ix));  
figure;imshow(uint8(Iy));  
  
Ix2=Ix.^2;  
Iy2=Iy.^2;  
Ixy=Ix.*Iy;  
%高斯滤波  
gauss=fspecial('gaussian',[5 5],2);  
Ix2=filter2(gauss,Ix2);  
Iy2=filter2(gauss,Iy2);  
Ixy=filter2(gauss,Ixy);  
%求角点量  
 R=(Ix2.*Iy2-Ixy.^2)./(Ix2+Iy2);%另一种角点量的计算方法 R=(Ix2.*Iy2 - Ixy.^2)-k*(Ix2+Iy2).^2;k=0.04  
 R(isnan(R))=0;%将无穷大的点赋值为0  
 
%设置阈值  
Rmax=0;  
for i=1:height  
    for j=1:width  
     if R(i,j)>Rmax  
         Rmax=R(i,j);  
     end  
    end  
end  
thresh = 0.3*Rmax; 

%求R局部最大值,并作为角点,在3x3窗口内计算  
result=zeros(height,width);  
for i=2:height-1  
    for j=2:width-1  
     if R(i,j)>thresh&&R(i,j)>R(i-1,j-1)&&R(i,j)>R(i-1,j)&&R(i,j)>R(i-1,j+1)&&R(i,j)>R(i,j-1)&&R(i,j)>R(i,j+1)&&R(i,j)>R(i+1,j-1)&&R(i,j)>R(i+1,j)&&R(i,j)>R(i+1,j+1)  
         result(i,j)=1; 
     end  
    end  
end  
%在图片上画出角点  
[h,w]=find(result==1);  
figure,imshow(uint8(image));  
hold on;  
plot(w,h,'ro'); 
figure,imshow(result);

 

 

相关标签: harris角点检测