2014-10-29 82 views
3

外检测圆我使用Python中的OpenCV HoughCircles方法如下:OpenCV的Python的HoughCircles:图像边界

circles = cv2.HoughCircles(img,cv.CV_HOUGH_GRADIENT,1,20, 
param1=50,param2=30,minRadius=0,maxRadius=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的是,它返回一个三维矩阵,其中第一维是单维度。为了消除这个单体维度,我做了circles[0, :]这将导致一个2D矩阵。这个新的二维矩阵的每一行都包含一个(x, y, r)的元组,并描述了圆圈在图像中的位置及其半径。我还将中心和半径转换为整数,以便稍后决定绘制它们时,您可以使用cv2.circle来完成。

+1

感谢您的解释和代码。 – Luca 2014-10-29 18:15:28

0

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