您的位置:首页 > 其它

使用自适应阈值和支持动态区域的曲率尺度空间角点检测(分析)

2013-01-01 22:09 519 查看
今天路过校园的草地,有管理人员在轰轰的开着机器割草,那草香扑鼻,不枉我是属兔子的,那么接下来兔发牛功:(分析步骤太细,篇幅将太大,后面部分简略,见源代码: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)在低尺度对每一个轮廓计算曲率,保存所有正确的角点

[b](4)
所有曲率局部最大被视为候选角点,根据边界噪声和细节特征去除圆角和错误的角点

(5)如果线型曲线的终点不接近于上面曲线的角点,则增加为角点[/b]

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 [b]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)增加终点为角点

[/b]

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)%分析输入

示例:

原图



[b]轮廓图:



角点标记图:



[/b]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: