今天路过校园的草地,有管理人员在轰轰的开着机器割草,那草香扑鼻,不枉我是属兔子的,那么接下来兔发牛功:(分析步骤太细,篇幅将太大,后面部分简略,见源代码:http://download.csdn.net/detail/lishizelibin/3802639)
function [cout,marked_img]=corner(varargin) %主函数,在灰度图中找角点
输入:
I - 输入图,可以是灰度图,彩色图或二值图
C - 主轴到辅轴的最小比率,使用提供的检测子能够检测顶点为角点,默认值为1.5
T_angle - 正确的角点的最大圆角,默认值162
Sig - 计算曲率时高斯滤波器的标准差,默认值为3
H, L - Canny算子的最大和最小阈值,默认值0.35和0
Endpoint - 控制曲线结束点是否为角点的标志,1为Yes,0为No,默认值为1
Gap-size - 填充轮廓的缝隙宽度不大于此值的缝隙,默认值是1 pixels
输出:
cout - 输入图像的角点坐标集合
maked_image - 带有角点标记的图像
示例:
I = imread('alumgrns.tif');
cout = corner(I,[],[],[],0.2);
[cout, marked_image] = corner;
cout = corner([],1.6,155);
步骤:
(1)对灰度图应用Canny算子,并获得二值边缘图
if size(I,3)==3
I=rgb2gray(I); %将彩色图转换为灰度图.
end
BW=EDGE(I,'canny',[L,H]); %canny边缘检测
(2)从二值边缘图获得边缘轮廓,并填充缝隙
[curve,curve_start,curve_end,curve_mode,curve_num]=extract_curve(BW,Gap_size); %extract_curve函数后面介绍
(3)在低尺度对每一个轮廓计算曲率,保存所有正确的角点
(4)所有曲率局部最大被视为候选角点,根据边界噪声和细节特征去除圆角和错误的角点
(5)如果线型曲线的终点不接近于上面曲线的角点,则增加为角点
cout=get_corner(curve,curve_start,curve_end,curve_mode,curve_num,BW,sig,Endpoint,C,T_angle); %get_corner后面介绍
后续工作:
img=I;
for i=1:size(cout,1)
img=mark(img,cout(i,1),cout(i,2),5);
end
marked_img=img;
figure(2)
imshow(marked_img);
title('Detected corners')
imwrite(marked_img,'corner.jpg');
function [curve,curve_start,curve_end,curve_mode,cur_num]=extract_curve(BW,Gap_size)
%首先对图像上方和左方各加Gap_size行或列得到BW1图像,并找到边缘像素坐标[r,c]
%while size(r,1)>0如果找到的坐标维数大于0
将BW1的第一个点置为0
在BW1上从第一个边缘点向左一个Gap_size到向右一个Gap_size,向上一个Gap_size到向下一个Gap_size,找到边缘像素坐标,存入[I, J]
%while size(I,1)>0
计算上面找到点距离dist=(I-Gap_size-1).^2+(J-Gap_size-1).^2;
迭代点:point=point+[I(index),J(index)]-Gap_size-1;
同样将BW1的第一个点置为0
在BW1上从第一个边缘点向左一个Gap_size到向右一个Gap_size,向上一个Gap_size到向下一个Gap_size,找到边缘像素坐标,存入[I, J]
% end while size(I,1)>0
%同样的方法在另一个方向上做
%获得曲线点
if size(cur,1)>(size(BW,1)+size(BW,2))/25
cur_num=cur_num+1;
curve{cur_num}=cur-Gap_size;
end
[r,c]=find(BW1==1);
%end while size(r,1)>0
%根据检测到的点,画出轮廓
function cout=get_corner(curve,curve_start,curve_end,curve_mode,curve_num,BW,sig,Endpoint,C,T_angle)
这个函数注释比较清楚,高斯卷积计算曲率,找曲率局部最大作为焦点候选,具体参考理论一文的公式
%与自适应局部阈值比较去除圆角
%根据边界噪声和琐碎细节来检查角点角度去除错误的角点(角点角度函数curve_tangent见后面)
根据步骤(5)增加终点为角点
function ang=curve_tangent(cur,center)
如果不是直线,则用椭圆来计算角度
另外两个辅助函数:
function img1=mark(img,x,y,w) %标记图像角点
function [I,C,T_angle,sig,H,L,Endpoint,Gap_size] = parse_inputs(varargin)%分析输入
示例:
原图

轮廓图:

角点标记图:

本文介绍了使用自适应阈值和支持动态区域的曲率尺度空间进行角点检测的方法。首先,通过Canny算子获取二值边缘图,然后填充轮廓并计算每个轮廓的曲率,接着筛选出局部最大值作为角点候选。最后,通过边界噪声和细节特征判断,确定真正的角点,并允许将线型曲线的终点视为角点。
375

被折叠的 条评论
为什么被折叠?



