簡體   English   中英

OpenCV:將單個圓擬合到圖像(在 Python 中)

[英]OpenCV: Fitting a single circle to an image (in Python)

我有這樣的圖像:

在此處輸入圖片說明

我需要在黑暗區域擬合一個橢圓(注意:必須是橢圓,而不是圓)。 在 OpenCV 中執行此操作的最佳方法是什么? 到目前為止,我的第一步是對其應用自適應 (Otsu) 閾值,結果是:

在此處輸入圖片說明

但我不確定從那里去哪里。 我正在用 Python 編寫應用程序,但更多的是我正在尋找的算法設計。

基於響應/評論的編輯:

好的,所以我已經嘗試了形態學。 根據OpenCV 文檔,我對其進行了 3 次迭代“關閉”操作(擴張,然后侵蝕)以去除小顆粒,結果:

在此處輸入圖片說明

然后,為了將其擴展回更接近原始形狀,我進行了 3 次迭代“打開”操作(腐蝕,然后膨脹),結果:

在此處輸入圖片說明

從這里開始,我做了 Canny 邊緣檢測,結果是:

在此處輸入圖片說明

現在,我在其上使用了findContours ,但遇到了問題。 它沿着邊緣發現了幾十個輪廓,每一個都是沿着圓周的一小段。 這意味着,即使我采用最大尺寸的輪廓,它也可能只代表周長的 10%,這不足以准確擬合橢圓。 這就是@Demi-Lune 建議的其他問題對我不起作用的原因; 它們都有非常干凈、銳利的邊緣, findContours找到了一個很好的單一輪廓,覆蓋了每個形狀的整個邊界,但對於我的凌亂圖像來說,這不會發生。 那么,從這里擬合橢圓的最佳方法是什么?

為什么不做“關閉”然后“打開”清除所有混亂的事情。

原始圖片:

原始圖像

大津:

大津

關閉+打開; 都是7x7內核; 二進制圖像現在美觀整潔。

關閉+打開

只檢測到一個輪廓:

一個輪廓

橢圓如下:(請注意,您的圖像是圓形,因此橢圓應為圓形)

橢圓

如果對象有圓形,那么使用cv2.minEnclosingCircle是好的。 或者,您可以使用cv2.fitEllipse查找對象周圍最合適的橢圓。 記得在黑色背景中找到與白色物體的輪廓。

import cv2
import numpy as np

img = cv2.imread("1.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
thresh = cv2.bitwise_not(thresh)

element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(5, 5))

morph_img = thresh.copy()
cv2.morphologyEx(src=thresh, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img)

contours,_ = cv2.findContours(morph_img,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

areas = [cv2.contourArea(c) for c in contours]
sorted_areas = np.sort(areas)

#bounding box (red)
cnt=contours[areas.index(sorted_areas[-1])] #the biggest contour
r = cv2.boundingRect(cnt)
cv2.rectangle(img,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,0,255),2)

#min circle (green)
(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv2.circle(img,center,radius,(0,255,0),2)

#fit ellipse (blue)
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img,ellipse,(255,0,0),2)


cv2.imshow("morph_img",morph_img)
cv2.imshow("img", img)
cv2.waitKey()

在此輸入圖像描述 在此輸入圖像描述

在對圖像應用自適應閾值后,您可以使用形態學操作來使用cv2.erode()cv2.dilate()來平滑圖像。 通過這些操作,您將能夠隔離主圓圖像並去除小顆粒噪聲。 接下來,您可以使用cv2.findContours()並過濾最大尺寸輪廓來定位圖像中的圓。 這將為您提供邊界框坐標,您可以在其中找到圓的中心。 一旦你有了中心坐標,你就可以適應你的日食。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM