haaris角点检测方法—超详细实现过程

本文介绍Haaris角点检测的基本原理,并通过Matlab程序实现角点检测的过程。包括获取图像边缘、计算角点量、非最大值抑制等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    haaris角点检测在一个或者是两个相机进行标定的时候常常用到,Opencv和matlab中都有现成的命令和程序可循。为了解角点检测的原理,自己动手查看资料并写matlab程序实现,相信这是记忆最快最深刻的方法。

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

 一、获取输入图像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为要进行滤波的图像.

注:filter2()函数在matlab中的 实现,在另一篇文章里将详述。

image

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

Ix

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

    

Iy

二、计算角点量。

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

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


高斯算子通过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很小时检测到的是平坦区域:

或者

其中k取0.4~0.6常用

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

Rmax= max(R(i,j))

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

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

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

可以看到好多角点处找到了两个点,图片放大就可以看到它们确实是不连续的。这是由于拍摄的时候镜头设置的问题造成的。这种问题可以通过设置高斯算子的窗口大小缓解,算子窗口越大,图像平滑度越高,角点分离不明显,将检测到越少的分离角点。反之将多检测到分离的角点。

理解原理推荐一篇博客:http://blog.youkuaiyun.com/yudingjun0611/article/details/7991601

这一次先写到这里,之后还会关注角点检测的方法和优化程序。

附程序:

  1. matlab  
  1. clc;  
  2. clear;  
  3. %function wx_conner()  
  4. image=imread('1.bmp');  
  5. th=0.1;  
  6. channel=size(image,3);  
  7. height=size(image,1);  
  8. width=size(image,2);  
  9. if channel==3;  
  10.     image=rgb2gray(image);  
  11. end  
  12. image=double(image);  
  13. figure;  
  14. imshow(uint8(image));  
  15. title('原图');  
  16. %求x和y方向的梯度图  
  17. % dx=[-2,-1,0,1,2];%横向梯度算子  
  18. % dy=[-2;-1;0;1;2];%纵向梯度算子  
  19. dx=[-1,0,1];%横向梯度算子  
  20. dy=[-1;0;1];%纵向梯度算子  
  21. Ix=zeros(height,width);  
  22. Iy=zeros(height,width);  
  23. Ix=filter2(dx,image);  
  24. Iy=filter2(dy,image);  
  25. %Ix = conv2(image, dx, 'same');   
  26. %Iy = conv2(image, dy, 'same');  
  27. % for i=3:height-2  
  28. %     for j=1:width  
  29. %      Ix(i,j)=-2*image(i-2,j)-image(i-1,j)+image(i+1,j)+image(i+2,j);     
  30. %     end  
  31. % end  
  32. % for i=1:height  
  33. %     for j=3:width-2  
  34. %      Iy(i,j)=-2*image(i,j-2)-image(i,j-1)+image(i,j+1)+image(i,j+2);     
  35. %     end  
  36. % end  
  37. figure;  
  38. imshow(uint8(Ix));  
  39. figure;  
  40. imshow(uint8(Iy));  
  41.   
  42. Ix2=Ix.^2;  
  43. Iy2=Iy.^2;  
  44. Ixy=Ix.*Iy;  
  45. %高斯滤波  
  46. gauss=fspecial('gaussian',[5 5],2);  
  47. Ix2=filter2(gauss,Ix2);  
  48. Iy2=filter2(gauss,Iy2);  
  49. Ixy=filter2(gauss,Ixy);  
  50. %求角点量  
  51.  R=(Ix2.*Iy2-Ixy.^2)./(Ix2+Iy2);%另一种角点量的计算方法 R=(Ix2.*Iy2 - Ixy.^2)-k*(Ix2+Iy2).^2;k=0.04  
  52.  R(isnan(R))=0;%将无穷大的点赋值为0  
  53. %设置阈值  
  54. Rmax=0;  
  55. for i=1:height  
  56.     for j=1:width  
  57.      if R(i,j)>Rmax  
  58.          Rmax=R(i,j);  
  59.      end  
  60.     end  
  61. end  
  62. thresh=th*Rmax;  
  63. %求R局部最大值,并作为角点,在3x3窗口内计算  
  64. result=zeros(height,width);  
  65. for i=2:height-1  
  66.     for j=2:width-1  
  67.      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)  
  68.          result(i,j)=1;  
  69.      end  
  70.     end  
  71. end  
  72. %在图片上画出角点  
  73. [h,w]=find(result==1);  
  74. figure  
  75. imshow(uint8(image));  
  76. hold on;  
  77. plot(w,h,'r*');


注意:本文用于收藏阅读,原文链接请见https://i-blog.csdnimg.cn/blog_migrate/12ef39e3f3b97532212c6f9244591701.png


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值