2014-09-06 221 views
0

我用各種OpenCV過濾器創建了黑色和白色面具。有四個圈是清晰可見black and white maskPython OpenCV從黑色和白色面具檢測圈

我試圖勾勒使用HoughCircles這些圈子,但它給許多誤報和一般壞的結果:

circles = cv2.HoughCircles(combined, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300)

circle outlines

哪有我正確地檢測到黑白圖像中的圓形?

這裏是一個可以與黑白圖像被用於運行的代碼:

import numpy as np 
import cv2 
import cv 

image = cv2.imread("image.png") 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 

circles = cv2.HoughCircles(gray, cv.CV_HOUGH_GRADIENT, 1, 300, np.array([]), 10, 30, 60, 300) 
if circles is not None: 
    circles = np.uint16(np.around(circles)) 
    for i in circles[0,:]: 
     cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 1) 
     cv2.circle(image, (i[0], i[1]), 2, (0, 0, 255), 3) 

cv2.imshow("thing", image) 

cv2.waitKey(0) 
cv2.destroyAllWindows() 
+1

如果您提供一段可運行的代碼來加載圖像並繪製圓圈,有人可能會傾向於查看它。 – Bull 2014-09-06 01:47:09

+0

謝謝@B ...添加了可運行代碼 – fruitcup 2014-09-06 01:52:50

回答

0

首先,如果我沒有記錯,Hough變換爲界需要一個空心圓,不是一個完整的一個。這意味着在應用霍夫變換之前,您只需要提取圓的邊界/周長。 OpenCV的findContoursarcLength函數將幫助您找到周界。

其次,不幸的是,在我的經驗中,霍夫變換對圓形的變化非常敏感,這意味着如果你試圖檢測的形狀是「幾乎」一個圓,它可能無法檢測到它。

我的建議是,您應該嘗試通過在您的二進制圖像上應用Closing morphological operation,使用盤形結構元素使對象「圓滑」。然後提取圖像中物體的周長,然後應用Hough變換。希望這會給你足夠好的結果。


或者,您可以嘗試使用RANSAC算法檢測圓。 Here是用於檢測線條的實現,但您可以爲圓圈進行調整 - 只需隨機選擇3個點(而不是2個),然後定義經過它們的圓。接下來,找出位於該圓圈附近的所有點(稱爲內點點)。它們將是滿足不等式幾點: enter image description here

其中(x,y)是點,(x0,y0)是圓心,r是它的半徑,margin是你必須調整參數。 算法的其餘部分是相同的。

祝你好運!

相關問題