Haaris角点检测
来源:互联网 发布:幻体 知乎 编辑:程序博客网 时间:2024/05/17 01:41
项目的一个问题:图像矩形检测,当然,一开始可能会想到霍夫变换,还有就是这个haaris角点检测。
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.csdn.net/yudingjun0611/article/details/7991601
这一次先写到这里,之后还会关注角点检测的方法和优化程序。
附程序:
matlab
clc;clear;%function wx_conner()image=imread('1.bmp');th=0.1;channel=size(image,3);height=size(image,1);width=size(image,2);if channel==3; image=rgb2gray(image);endimage=double(image);figure;imshow(uint8(image));title('原图');%求x和y方向的梯度图% dx=[-2,-1,0,1,2];%横向梯度算子% dy=[-2;-1;0;1;2];%纵向梯度算子dx=[-1,0,1];%横向梯度算子dy=[-1;0;1];%纵向梯度算子Ix=zeros(height,width);Iy=zeros(height,width);Ix=filter2(dx,image);Iy=filter2(dy,image);%Ix = conv2(image, dx, 'same'); %Iy = conv2(image, dy, 'same');% for i=3:height-2% for j=1:width% Ix(i,j)=-2*image(i-2,j)-image(i-1,j)+image(i+1,j)+image(i+2,j); % end% end% for i=1:height% for j=3:width-2% Iy(i,j)=-2*image(i,j-2)-image(i,j-1)+image(i,j+1)+image(i,j+2); % end% endfigure;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 endendthresh=th*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 endend%在图片上画出角点[h,w]=find(result==1);figureimshow(uint8(image));hold on;plot(w,h,'r*');
- Haaris角点检测
- haaris角点检测方法—超详细实现过程
- haaris角点检测方法—超详细实现过程
- 角点检测,圆形检测
- 角点检测 susan角点检测
- 角点检测Harris角点检测
- 角点检测
- Harris 角点检测
- 角点检测
- 角点 检测
- 角点检测
- OpenCV角点检测
- 角点检测
- 角点检测算法
- Harris角点检测
- Harris角点检测
- 角点检测
- Moravec角点检测
- jsp获取系统时间
- 使用 json 进行神经网络结构信息的格式化 (dump & load)
- beyond compare 中文乱码问题解决方法
- Unify学习笔记2
- postgresql cluster和correlation
- Haaris角点检测
- CryptoAPI简介(二)
- Memcached的学习与使用
- 协方差的意义和计算公式
- pl SQL32位客户端无法连接64位数据库解决办法
- 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()
- LibSVM-windows
- php杂技
- 无线网卡模式【2】