gpt4 book ai didi

python - OpenCV:将单个圆圈拟合到图像(在 Python 中)

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:21 25 4
gpt4 key购买 nike

我有这样一张图片:

enter image description here

我需要将椭圆拟合到黑暗区域(注意:必须是椭圆,而不是圆形)。在 OpenCV 中执行此操作的最佳方法是什么?到目前为止,我的第一步是对其应用自适应 (Otsu) 阈值,结果是:

enter image description here

但我不确定从那里去哪里。我正在用 Python 编写应用程序,但它更像是我正在寻找的算法设计。

根据回复/评论编辑:

好的,所以我已经尝试了形态学。基于OpenCV documentation ,我对其进行了 3 次迭代“关闭”操作(膨胀,然后是腐 eclipse )以去除小颗粒,结果是:

enter image description here

然后,为了将其扩展回更接近原始形状,我进行了 3 次迭代“打开”操作(腐 eclipse ,然后膨胀),结果是:

enter image description here

从这里开始,我进行了 Canny 边缘检测,结果是:

enter image description here

现在,我在上面使用了 findContours,但遇到了问题。它沿着边缘发现了数十个轮廓,每个轮廓都是沿着圆周的一小段。这意味着,即使我采用最大尺寸的轮廓,它也可能只代表圆周的 10%,这不足以准确拟合椭圆。这就是为什么@Demi-Lune 建议的其他问题对我不起作用;它们都有非常干净、锐利的边缘,findContours 找到了一个漂亮的单一轮廓,覆盖了每个形状的整个周边,但我的杂乱图像不会出现这种情况。那么,从这里拟合椭圆的最佳方法是什么?

最佳答案

如果对象有圆形,那么使用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()

enter image description here enter image description here

关于python - OpenCV:将单个圆圈拟合到图像(在 Python 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55621959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com