OpenCV Python HoughCircles:在图像边界之外检测到的圆圈

时间:2014-10-29 17:00:54

标签: python opencv image-processing hough-transform

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

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

这看起来效果很好。但是,我注意到的一件事是它检测到可以延伸到图像边界之外的圆圈。有谁知道如何过滤这些结果?

2 个答案:

答案 0 :(得分:4)

将每个圆圈视为在尺寸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矩阵。这个新2D矩阵的每一行都包含一个(x, y, r)元组,用于表征圆在图像中的位置及其半径。我还将中心和半径转换为整数,这样如果您决定稍后绘制它们,您将能够使用cv2.circle进行绘制。

答案 1 :(得分:0)

你可以,添加一个功能,它将取中心和圆的半径加起来/并减去并检查这是否会在图像边界之外产生。