【问题标题】:OpenCV Python HoughCircles: Circles detected outside of image boundaryOpenCV Python HoughCircles:在图像边界之外检测到的圆圈
【发布时间】:2014-10-29 17:00:54
【问题描述】:

我在 Python 中使用 OpenCV HoughCircles 方法如下:

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

这似乎工作得很好。然而,我注意到的一件事是它检测到可以延伸到图像边界之外的圆圈。有谁知道我可以如何过滤掉这些结果?

【问题讨论】:

    标签: python opencv image-processing hough-transform


    【解决方案1】:

    将每个圆想象成在一个尺寸为2r x 2r 的正方形内,其中r 是圆的半径。此外,该框的中心位于(x,y),这也对应于圆心在图像中的位置。要查看圆圈是否在图像边界内,您只需确保包含圆圈的框不会超出图像范围。从数学上讲,您需要确保:

    r <= x <= cols-1-r
    r <= y <= rows-1-r # Assuming 0-indexing
    

    rowscols 是图像的行和列。您现在真正需要做的就是遍历检测结果中的每个圆圈,并通过检查每个圆圈的中心是否在上面指定的两个不等式内来过滤掉那些超出图像边界的圆圈。如果圆圈在两个不等式之内,则可以保存该圆圈。任何不满足不等式的圆圈,您都不会将其包含在最终结果中。

    要将此逻辑写入代码,请执行以下操作:

    import cv # Load in relevant packages
    import cv2
    import numpy as np
    
    img = cv2.imread(...,0) # Load in image here - Ensure 8-bit grayscale
    final_circles = [] # Stores the final circles that don't go out of bounds
    circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) # Your code
    rows = img.shape[0] # Obtain rows and columns
    cols = img.shape[1]
    circles = np.round(circles[0, :]).astype("int") # Convert to integer
    for (x, y, r) in circles: # For each circle we have detected...
        if (r <= x <= cols-1-r) and (r <= y <= rows-1-r): # Check if circle is within boundary
            final_circles.append([x, y, r]) # If it is, add this to our final list
    
    final_circles = np.asarray(final_circles).astype("int") # Convert to numpy array for compatability
    

    cv2.HoughCircles 的特殊之处在于它返回一个 3D 矩阵,其中第一个维度是单维。为了消除这个单一维度,我做了circles[0, :],这将产生一个二维矩阵。这个新的 2D 矩阵的每一行都包含一个 (x, y, r) 元组,并描述了一个圆在图像中的位置及其半径。我还将中心和半径转换为整数,因此如果您稍后决定绘制它们,您可以使用cv2.circle 来完成。

    【讨论】:

      【解决方案2】:

      您可以添加一个函数,将圆的中心和半径相加/相减,并检查这是否会超出您的图像边界。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多