我试图检测图像中的完整圆圈和半圆 .
我遵循下面提到的过程:过程图像(包括Canny边缘检测)查找轮廓并在空图像上绘制它们,以便我可以消除不需要的组件 . (处理后的图像正是我想要的 . )使用HoughCircles检测圆圈 . 这就是我得到的 .
我尝试改变HoughCircles中的参数,但结果不一致,因为它根据光照和图像中圆圈的位置而变化 . 我根据它的大小接受或拒绝一个圆圈 . 所以结果是不可接受的 . 我还有一长串“可接受的”圈子,所以我需要在HoughCircle参数中留出一些余量 . 至于完整的圆圈,很容易 - 我可以简单地找到轮廓的“圆度” . 问题是半圈!
请在hough变换前找到编辑过的图像
5 回答
直接在图像上使用
houghCircle
,不要先提取边缘 . 然后测试每个检测到的圆圈,图像中确实存在多少百分比:对于此输入:
它给出了这个输出:
红圈是霍夫的结果 .
圆上的绿色采样点是内点 .
蓝点是异常值 .
控制台输出:
如果你想测试RANSAC而不是Hough,请看this .
我知道它有点晚了,但我使用了更简单的方法 . 从
cv2.HoughCircles(...)
,你得到圆的中心和直径(x,y,r) . 因此,我只需浏览圆圈的所有中心点,然后检查它们是否远离图像边缘而不是直径 .这是我的代码:
这是另一种方法,一个简单的RANSAC版本(要提高速度的大量优化),适用于Edge Image .
该方法循环这些步骤,直到它被取消
随机选择3个边缘像素
从它们估计圆圈(3个点足以识别圆圈)
验证或伪造它实际上是一个圆圈:计算给定边缘表示圆圈的百分比
如果验证了圆圈,请从输入/ egdes中删除圆圈
输入:
输出:
控制台输出:
优化应包括:
使用所有inlier来适应更好的圆圈
在每个检测到的圆圈之后不计算距离变换(它非常昂贵) . 直接从点/边集设置inlier并从该列表中删除inlier边 .
如果图像中有许多小圆圈(和/或大量噪声),则不太可能随机打3个边缘像素或圆圈 . =>首先尝试轮廓检测并检测每个轮廓的圆圈 . 之后尝试检测图像中剩余的所有“其他”圆圈 .
很多其他的东西
霍夫算法检测到的半圆最可能是正确的 . 这里的问题可能是,除非您严格控制场景的几何形状,即相机相对于目标的精确位置,以便图像轴垂直于目标平面,您将获得省略号而不是投影在图像上的圆圈平面 . 更不用说由光学系统引起的扭曲,这进一步使几何图形退化 . 如果你依靠精确度,我会推荐camera calibration .
你最好尝试不同的 kernel for gaussian blur . 这对你有帮助
所以改变
size(i,i),j,j)