使用自适应阈值和支持动态区域的曲率尺度空间角点检测(分析)
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]
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]
相关文章推荐
- 使用自适应阈值和支持动态区域的曲率尺度空间角点检测(理论)
- 自适应空间的PopupWindow,动态修改显示位置(支持上下)
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
- 动态链接共享库的分析和使用
- 动态二维数组的申请、赋初值、使用、释放空间
- Delphi中使用SetLength分配的动态数组空间在越界赋值后出现invalid pointer operation异常
- 使用Oracle的动态SQL支持
- PHP命名空间(namespace)的动态访问及使用技巧
- undo 表空间使用案例分析(UNDOTBS1使用率100%,enq:US-contention,释放undo)
- Linux下的动态共享链接库的分析与使用
- Java JDK 动态代理使用及实现原理分析
- YII动态模型(动态表名)支持分析
- IDA Pro使用(静态分析+动态调试)
- 【OpenCV】SIFT原理与源码分析:DoG尺度空间构造
- <s:doubleselect 的使用-不支持EL表达式,需要使用OGNL来动态赋值-could not be resolved as a collection/array/map/enumerati
- 分析动态代理Java JDK 动态代理(AOP)使用及实现原理分析
- 使用ASPOSE.WORD组件,在word文档指定的位置动态生成表格,支持单元格合并及背景填充
- 使用ida逆向分析dll动态链接库时,动态调式指定输出函数
- IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象
- 使用delete释放new[]的空间造成的错误分析