【发布时间】:2019-06-19 08:39:27
【问题描述】:
我有一个椭圆的图像,如果图像有椭圆,我会使用 findcontours() 找到它,然后我想将此椭圆转换为圆形。
查看示例
我想让他们每个人都喜欢这个
首先我应用了 canny 边缘检测。然后在此图像上应用 findcontour()。
我使用 findcontours() 找到了椭圆来获取所有轮廓并获得所需的椭圆轮廓,然后我使用 fitellipse() 来获取椭圆的中心、旋转角度以及长轴和短轴。
然后我尝试通过旋转角度旋转图像,然后缩放图像 w.r.t 短轴和长轴的高度和宽度(即使长轴和短轴长度相同)但我也没有得到正确的圆形对象图像如上。左边会有一些旋转/它仍然会像一个接近圆形的椭圆。
_, contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
if len(c) >= 5:
a = cv2.fitEllipse(c)
(x, y), (MA, ma), angle = a
area = (math.pi * MA * ma)/4
if abs(x-image.shape[0]/2) <= 2 and abs(y-image.shape[1]/2) <= 2 and (area - cv2.contourArea(c)) < 50:
screenCount = c
width, height = MA, ma
centerX, centerY = x, y
ellipseAngle = angle
print(width, height, centerX, centerY, ellipseAngle)
# cv2.drawContours(img, c, -1, (0, 255, 0), 4)
cv2.ellipse(img, a, (0, 0, 255), 2, 8)
cv2.imshow("ellipse", img)
break
img = image.copy()
if ellipseAngle < 90:
rotatedImg = imutils.rotate(img, ellipseAngle)
else:
rotatedImg = imutils.rotate(img, -(ellipseAngle - 90))
然后我根据主轴和次轴进行缩放
应用 findcontour() 后,我得到了帖子中第一张图像的这 2 个轮廓
从这些任何轮廓都可以吗?我根据代码使用来自countour的第一个轮廓,fitellipse()给了我这个椭圆
已编辑 - 如果有任何更好的方法来解决这个问题,那将会很有帮助。
【问题讨论】:
-
无需查看您的代码,这似乎是使用 SVD 的最佳案例(请参阅 wikipedia 中的动画 gif)
-
@Veer 关于您对我的回答的评论(我将在您可能edited your question 之后删除):我建议您选择另一个输入示例,就像您在评论中描述的那样,让我们说一些带有红色矩形的黑色椭圆,为了清楚起见,您也想转换椭圆内的任何东西(如果我理解正确的话)。从最初的问题陈述来看,我不会这样想(显然,安德是这样想的,但我不是)。
-
为什么不直接从一端到另一端获取长轴直径,除以 2 并使用它作为半径在椭圆上绘制一个新的黑色圆圈?
-
@fmw42 如果椭圆颜色不同,我需要椭圆内的信息将不起作用。
-
@AnderBiguri 我已经阅读了 SVD wiki 页面,但是我如何使用椭圆的图像获取矩阵,并且 wiki 中的方法解释是从圆形到椭圆的转换,但这个问题恰恰相反
标签: python opencv image-processing computer-vision