【问题标题】:How to improve Hough Circle Transform to detect a circle made up of scattered points如何改进霍夫圆变换以检测由散点组成的圆
【发布时间】:2017-07-01 13:41:37
【问题描述】:

我有一个非常基本的代码,它使用 openCV 中的标准化 HoughCircles 命令来检测圆。但是,我的问题是我的数据(图像)是使用一种算法(出于数据模拟的目的)生成的,该算法在 r 的 +-15%(随机在此范围内)范围内绘制一个点(其中 r 是半径圆,它是随机生成的,介于 5 和 10 之间(实数)),并使用圆方程进行 360 度。 (附上示例图片)。 http://imgur.com/a/iIZ1N 现在使用霍夫圆命令,我能够通过手动播放参数来检测半径大致相同的圆(通过设置轨迹栏,灵感来自相同性质的 github 代码),但我想自动化这个过程我有超过 1000 张图像,我想一遍又一遍地这样做。有没有更好的方法来做到这一点?或者,如果有人有任何建议,我将非常感谢他们,因为我是图像处理领域的初学者,并且有物理背景而不是 CS 背景。 我的代码的粗略示例(下面没有轨迹栏等):

Mat img = imread("C:\\Users\\walee\\Documents\\MATLAB\\plot_2 .jpeg", 0);
Mat cimg,copy;
copy = img;
medianBlur(img, img, 5);
GaussianBlur(img, img, Size(1, 5), 1.1, 0);

cvtColor(img, cimg, COLOR_GRAY2BGR);
vector<Vec3f> circles;
HoughCircles(img, circles, HOUGH_GRADIENT,1, 10, 94, 57, 120, 250);
for (size_t i = 0; i < circles.size(); i++)
{
    Vec3i c = circles[i];
    circle(cimg, Point(c[0], c[1]), c[2], Scalar(0, 0, 255), 1, LINE_AA);
    circle(cimg, Point(c[0], c[1]), 2, Scalar(0, 255, 0), 1, LINE_AA);
}
imshow("detected circles", cimg);
waitKey();
return 0;

【问题讨论】:

    标签: opencv image-processing feature-detection hough-transform


    【解决方案1】:

    如果所有图像具有相同的性质(黑色轴和点为圆圈),我建议执行以下操作:

    1) 通过查找黑色元素来移除轴并将其替换为背景

    2) 将颜色反转为黑色背景

    3) 执行形态闭合以填充圆圈并创建更多实心点

    4) (可选)如果点的密度很高,你可以尝试应用另一种形态学操作,即扩张使数据圈变细

    5) 应用霍夫圆

    【讨论】:

    • 我会填满圈子并尽快回复您,因为这样做很容易。 (因为它是一个模拟,我可以控制我给程序的数据,非实心圆圈只是我在数据生成过程中的懒惰)。至于反转颜色,我的印象是二值化图像使图像只有黑白,我的假设是错误的吗?
    • 没错——二值化使图像变成黑白。我只想确保背景是黑色的,前景是白色的。否则形态学操作将相反。
    • 我尝试了所有这些,虽然它确实改善了前几张图片的效果,但该程序未能为更多图片做到这一点。我还想过实现一种搜索算法来寻找累加器数组的完美值,以检测最佳单个圆,但随后程序开始检测到比我预期的小一点的圆。
    • 你能发布一些失败的示例图像吗?同时标记找到的圈子和您想要的圈子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多