【问题标题】:houghcircles - finding parametershoughcircles - 寻找参数
【发布时间】:2016-07-14 16:52:07
【问题描述】:

有没有一种方法可以使圆检测无参数? - 为什么cv2.HoughCircles() 中的参数在更改后有时不会受到影响?我有一个 for 循环来更改参数,但它不会一直影响结果。

Hough Circles 似乎需要用户进行大量参数优化,如果用户想以非常通用的方式使用系统,这是一个可怕的问题。因此,我正在尝试创建一个算法来自动找到 opencv 的 houghcirlces 函数的最佳参数。 目前,houghcirlces 函数会获取在图像中找到的圆的最大和最小半径,并带有一些阈值来确定找到的圆的匹配程度。

我希望将不同的范围划分为最小和最大半径进行搜索,然后使用在每个部分中找到的圆来确定我应该使用哪些参数进行最终的 houghcircles 变换。 (如果有人对此有更好的方法,我很乐意听到。)

但是我遇到了这个问题:

似乎没有考虑最小和最大半径参数,或者 Canny 和 Hough 空间阈值


例如,我们可以拍摄这张图片:


(来源:stanford.edu

并运行下面的代码:

import numpy as np
import cv2

file_path = '1.png'
img = cv2.imread(file_path)
gray = cv2.imread(file_path, cv2.IMREAD_GRAYSCALE)
# Begin using the largest dimesion of the image as the largest possible radius
largest_dimension = np.max([gray.shape[0], gray.shape[1]])
for i in range(1,100):
    # For the first iteration we use the largest possible radius
    if i == 1:
        maxRadius = largest_dimension
    # THe next iterations we use what the minimum radius was last iteration 
    else:
        maxRadius = minRadius
    # Reduce the size by 2 everytime
    minRadius = maxRadius/2
    dp = 1 # Inverse ratio of thresholded image resolution ?? Not sure what to do with this
    minDist = minRadius # Not likely to be much closer than the minimum radius...?
    param1 = 200 # Canny edge threshold - image OTSU threshold dependence ?? 
    param2 = 100 # Hough space threshold - radius dependance?  np.pi*maxRadius**2 ??
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius)

    # Display some inforation about the results
    if circles is not None:
        img_copy = img.copy()
        radii = np.array([c[2] for c in circles[0]])
        num = len(circles[0])
        avg = np.mean(radii)
        print str(num) + ' found: avg radius: ' + str(avg)
        if any(radii < minRadius) or any(radii > maxRadius):
            print 'The minimum and maximum radii given are not being respected' 
        for c in circles[0]:
            cv2.circle(img_copy, (c[0],c[1]), c[2], (255,0,255),2)

        cv2.namedWindow('', cv2.WINDOW_NORMAL)
        cv2.imshow('',img_copy)
        cv2.waitKey(0)

我们将得到如下所示的输出,并且函数不会每次都考虑半径。此外,如果我们将 param1 和 param2(Canny 边缘检测和 Hough 空间阈值)从 3 更改为 6000,几乎没有任何变化。

显然,下面显示的图像检测到的圆圈比任何人通常都多得多,而且只会变得更糟。

我可能会提到,我想在将来使用此脚本的图像将显示为如下所示:

【问题讨论】:

  • 圆的霍夫变换是一种非常“愚蠢”的算法。它会根据您的参数暴力破解图像。如果你不指定半径,那么它必须对所有半径进行暴力破解,这将花费太长时间。
  • 在你的前 2 个火图像中,我不认为在精明的边缘之后有任何圆圈,tbh
  • 你可以使用canny边缘检测与你在hough中选择的upper thres = param和lower thres = param/2来查看将在哪些图像圈中搜索。
  • 我尝试使用我的 param1 和 param1/2 作为阈值运行 Canny,即使我将值设为 2000(制作黑色图像),我仍然可以从 houghcirlces 获得完全相同的输出。似乎只有最小最大半径参数会发生任何变化,但它们仍然无法正常工作。
  • 是的,在 Canny 工作之前,我需要对其中一些图像进行一些处理步骤,但这也是我将它们放在那里的原因之一,以防有人提出 Voroni 或 Watershed 或在 Canny 之前我不知道要使用的东西。

标签: python opencv image-processing hough-transform


【解决方案1】:

我遇到了同样的问题,参数行为异常 - 你有

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius)

但函数签名实际上是

>>> import cv2
>>> print cv2.HoughCircles.__doc__
HoughCircles(image, method, dp, minDist[, circles[, param1[, param2[, minRadius[, maxRadius]]]]]) -> circles

注意参数列表中的circles -

我从某处复制了一些代码,这些代码明确命名了其余参数,例如

circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)

在某些时候我删除了这些名字。错误!

【讨论】:

    【解决方案2】:

    为了更准确地检测圆圈并消除噪音,我实际上会在将灰度图像发送到 HoughCircles() 方法之前对灰度图像执行一个精确的边缘检测器。通过这样做,您可以获得更高的边缘检测阈值精度,因为您可以完全控制两个参数,而不仅仅是一个。

    Canny(src_gray, src_gray, 300, 500, 3 );
    HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, image.rows/2, 30, 30, 40, 1000 );
    

    玩转 canny() 方法的参数,特别是 300 和 500,并为您的用例找到最佳位置。希望这有帮助!祝你好运

    【讨论】:

    • 我正在使用 HoughCircles 使用 5MP 相机检测金属件中的孔,并添加 Canny 作为预处理并没有真正帮助!通过调整 dp 参数,我得到了一些改进的结果...
    猜你喜欢
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2011-03-24
    相关资源
    最近更新 更多