gpt4 book ai didi

python - OpenCV:用轮廓上的大多数点拟合椭圆(而不是最小二乘法)

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:39 29 4
gpt4 key购买 nike

我有一个二值化图像,我已经对其使用了打开/关闭形态学操作(这是我能得到的最干净的,相信我),看起来像这样: enter image description here

如您所见,有一个明显的椭圆,顶部有些变形。 注意:我没有关于圆圈大小的先验信息,这必须非常快地运行(我发现 HoughCircles 太慢了)。我正在尝试弄清楚如何将椭圆拟合到它,使其最大化拟合椭圆上对应于形状边缘的点数。也就是说,我想要这样的结果: enter image description here

但是,我似乎无法在 OpenCV 中找到执行此操作的方法。使用常用工具 fitEllipse(蓝线)和 minAreaRect(绿线),我得到了这些结果: enter image description here

这显然不代表我要检测的实际椭圆。关于如何实现这一目标的任何想法?很高兴看到 Python 或 C++ 中的示例。

最佳答案

鉴于显示的示例图像,我对以下陈述非常怀疑:

which I've already used open/close morphology operations on (this is as clean as I can get it, trust me on this)

并且,在阅读您的评论后,

For precision, I need it to be fit within about 2 pixels accuracy

我很确定,使用形态学操作可能会得到很好的近似值。

请看下面的代码:

import cv2

# Load image (as BGR for later drawing the circle)
image = cv2.imread('images/hvFJF.jpg', cv2.IMREAD_COLOR)

# Convert to grayscale
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Get rid of possible JPG artifacts (when do people learn to use PNG?...)
_, gray = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY)

# Downsize image (by factor 4) to speed up morphological operations
gray = cv2.resize(gray, dsize=(0, 0), fx=0.25, fy=0.25)

# Morphological Closing: Get rid of the hole
gray = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5)))

# Morphological opening: Get rid of the stuff at the top of the circle
gray = cv2.morphologyEx(gray, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (121, 121)))

# Resize image to original size
gray = cv2.resize(gray, dsize=(image.shape[1], image.shape[0]))

# Find contours (only most external)
cnts, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# Draw found contour(s) in input image
image = cv2.drawContours(image, cnts, -1, (0, 0, 255), 2)

cv2.imwrite('images/intermediate.png', gray)
cv2.imwrite('images/result.png', image)

中间图像是这样的:

Intermediate

最后的结果是这样的:

Result

由于您的图像非常大,我认为缩小图像尺寸不会造成任何伤害。以下形态学操作被(大大)加速,这可能对您的设置感兴趣。

根据您的说法:

NOTE: I do not have prior info as to the size of the circle[...]

您通常可以从输入中找到上述内核大小的适当近似值。由于只给出了一张示例图像,我们无法知道该问题的可变性。

希望对您有所帮助!

关于python - OpenCV:用轮廓上的大多数点拟合椭圆(而不是最小二乘法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55907678/

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