Halcon_Hough变换检测直线,检测圆

按:为回复Halon论坛的帖子“如何利用霍夫变换检测图像的倾斜角度,作者试着用Halcon实现Hough line的直线检测;然后对此进行延伸——用Halcon做了Hough circle圆检测。谨以此文做一下总结。

背景资料:

Hough直线检测圆检测的原理部分,可参考这一帖子,文中对这一原理解释得十分详尽。参看:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/

测试代码:

//Line detection

read_image (Image, 'E:/Halcon_projects/Hough_LineCircle/HoughToFindLine.bmp')
* Detect edges (amplitude) using the Sobel operator
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 9)
dev_set_color ('red')
threshold (EdgeAmplitude, Region, 70, 255)
hough_lines (Region, 8, 400, 5, 5, Angle, Dist)
hough_line_trans(Region, HoughImage, 4)
dev_set_color ('blue')
* Store input lines described in HNF
gen_region_hline (Regions, Angle, Dist)
degree := deg(Angle)
//Circle detection
read_image(Image_circle,'E:/Halcon_projects/Hough_LineCircle/Circle_detection.jpg')
sobel_amp(Image_circle, EdgeAmplitude1, 'sum_abs', 5)
threshold(EdgeAmplitude1, Region_circle, 80, 255)
* Detect Circle 1
hough_circles(Region_circle, RegionOut1, 10, 80, 1)
connection(RegionOut1, ConnectedRegions1)
* Detect Circle 2
hough_circles(Region_circle, RegionOut2, 195, 70, 1)
hough_circle_trans(Region_circle, HoughImage1, 195)
connection(RegionOut2, ConnectedRegions2)


1. 直线检测

halcon的函数原型为hough_lines(RegionIn : : AngleResolution,Threshold,AngleGap,DistGap :Angle,Dist)

* 要求输入的Object为Region

* AngleResolution用于控制直线的检测精度(AngleResolution=2时,检测精度为1/2度);

* Threshold即为目标线/轮廓落在Hough Line上的像素个数;

* AngleGapDistGap用于控制所有直线检测结果中,近似直线的区分度。如a)两条几乎重叠但存在小角度的直线,可调整AngleGap这一参数使检测结果唯一, b) 两条几乎平行但和距离很近的直线,DistGap参数可进行控制这一情形。

* AngleDist即为直线极坐标表示法下的两个参数:原点到直线的距离和直线垂线的方位角。

首选调整AngleResolution这一参数得到预期结果,然后在对其余参数进行优选,保证检测结果稳定。

测试图:


变换至Hough平面:


检测结果:


2. 圆检测

Hough圆检测在Halcon上的实现较为简单,输入仍为Region,而OpenCV的HoughCircles则基于图像梯度进行检测。函数原型:hough_circles(RegionIn : RegionOut : Radius,Percent,Mode : )

* RegionIn 要求输入的Object为Region;

* RegionOut 检测得到的可能的圆心位置,单个圆检测的结果区域可能为3~4个像素区域,不一定为单像素;

* RadiusPercentage 程序设计者需预先知道像素半径值RadiusPercentage为待检测圆的完整度,对于完整的圆90%应该就行了;

* Mode

0: 此模式下,设定的Radius半径针对圆区域(往往是圆环)的外边缘

1:设定的半径Radiu针对圆环中间线

结果--4个小圆:


直线检测原图,可至Halcon论坛中相应帖子下载: http://www.ihalcon.com/read-6632-1.html#63713。

圆检测的图片,见附件

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Halcon中的Hough变换算法是通过 `hough_circle`、`hough_line`、`hough_linesegment` 等函数实现的。其中,`hough_circle` 函数用于检测形,`hough_line` 函数用于检测直线,`hough_linesegment` 函数用于检测线段。下面以 `hough_circle` 函数为例,介绍Halcon中Hough变换算法的具体实现过程。 Halcon中的Hough变换算法主要分为以下几步: 1. 对输入图像进行预处理,如灰度化、平滑处理等。 2. 在预处理后的图像中,对每个像素点进行遍历,判断该像素点是否为心候选点,如果是,则在心累加器数组中进行计数。 3. 对累加器数组进行阈值化处理,得到心候选点。 4. 对每个心候选点进行检测和参数估计,得到检测出的心和半径。 下面是一个简单的Halcon检测的示例代码: ``` read_image(Image,'test.jpg') gray_image(Image,GrayImage) gauss_image(GrayImage,GaussImage,5) threshold(GaussImage,ThresholdImage,100,255) hough_circle(ThresholdImage,CircleCandidates,300,200,10,20) gen_circle_contour_xld(CircleContours,CircleCandidates[0],CircleCandidates[1],CircleCandidates[2],0,6.28318,'margin') ``` 其中,第一行读入图像,第二行将图像转换为灰度图像,第三行对灰度图像进行高斯平滑处理,第四行对处理后的图像进行二值化处理,第五行使用 `hough_circle` 函数对二值化后的图像进行检测,第六行使用 `gen_circle_contour_xld` 函数生成检测出的的轮廓。在 `hough_circle` 函数中,参数300和200分别表示的半径范围,10表示心候选点的最小计数值,20表示心候选点的最小距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值