【问题标题】:How exactly does dp parameter in cv::HoughCircles work?cv::HoughCircles 中的 dp 参数究竟是如何工作的?
【发布时间】:2016-01-10 13:42:50
【问题描述】:

我在 Stack Overflow 中读到过类似的 question。我试过了,但我仍然无法理解它是如何工作的。

我阅读了OpenCV文档cv::HoughCircles,这里是关于dp参数的一些解释:

累加器分辨率与图像分辨率的反比。例如,如果 dp=1 ,则累加器具有与输入图像相同的分辨率。如果 dp=2 ,累加器的宽度和高度只有一半。

这是我的问题。比如dp=1,accumulator的大小和image一样,image中的像素点和accumulator中的位置是一致的一一匹配,但是如果dp=2,怎么匹配呢?

提前致谢。

【问题讨论】:

    标签: opencv computer-vision computer-science hough-transform


    【解决方案1】:

    这里没有一对一的匹配。您确实有一个带有像素和霍夫空间的图像,用于对圆圈进行投票。这个参数只是一种方便的方式来指定霍夫空间相对于图像大小的大小。

    请查看此answer 了解更多详情。

    编辑:

    您的图像具有(x,y)-坐标。你的圆形霍夫空间有(a,b,r)-坐标,而(a,b) 是圆心,r 是半径。假设您找到了一个边缘像素。现在你为每个可以通过这个边缘像素的圆圈投票。我发现this 霍夫空间的漂亮图片带有 single 投票,即 single 边缘像素(连续情况)。实际上,此投票发生在 3D 累加器矩阵中。您可以将其视为这种连续情况的光栅化。

    现在,正如已经提到的,dp 参数定义了这个累加器矩阵相对于图像大小的大小。 dp 参数越大,光栅化的分辨率越低。这就像拍摄不同分辨率的照片。如果你缩小你的照片,多个像素将减少到一个。如果您减少累加器矩阵分别增加您的 dp 参数,也会发生同样的情况。现在合并了针对不同圆心(彼此相邻)和半径(大小相似)的多个投票,即您确实获得了不太准确的圆参数,但投票更“稳健”。

    请注意,OpenCV 实现有点复杂(他们使用霍夫梯度方法而不是标准霍夫变换),但考虑因素仍然适用。

    【讨论】:

    • 感谢您的回答,但我仍有疑问。霍夫空间用于检测圆时是3D矩阵。正如wikipedia 所说,我们在累加器矩阵中找到了局部最大值。但是在 3D 中找到局部最大值很昂贵。所以我们选择设置半径范围的权衡方式。这将矩阵(用于投票)的维度退化为 2D,以便我们可以快速找到局部最大值。在您的另一个答案中,您的 dp 越小,您的投票分辨率就越高。当dp = 1时,我知道矩阵的大小与图像相同。
    • 那么对于原始空间中的每个“边”点,我们可以在参数空间中制定一个圆,并增加该圆所经过的网格单元的投票数。由于矩阵的大小与图像相同,我们可以找到一致的一对一匹配进行投票,然后找到局部最大值并知道其坐标(x,y,r)。换句话说,当大小相同时,我知道在哪里投票。但是如果 dp = 2 或其他值,我不知道如何投票。我不是英语母语人士,所以你明白我的想法吗?谢谢。
    • 考虑到标准霍夫变换,当(且仅当)您具有固定半径(而不是范围)时,您的累加器矩阵仅是 2D 的。但是,我查看了 OpenCV 的实现,无论哪种情况,他们都使用一些技巧将矩阵缩减为 2D。
    • 但是还是看不懂。比如一张100*100的图片(所有像素的值为0),然后我们在这张图片上画一个半径为50的圆。那么如果dp = 2,如何进行投票和检测?累加器的大小是50*50,我觉得还不够。你怎么看?
    • 对不起,我没有注意到你的更新。现在我明白了,靠近的像素将被合并。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多