使用 fitEllipse 对图像进行椭圆拟合

使用 OpenCV fitEllipse,我想执行 3900 × 3072 png 图像(Python 3.6.7)的椭圆拟合。


作为输入图像,我使用 AMD 14 目录中的图像,该目录分布在以下站点。


最终,我想创建一个蒙版,通过将椭圆形状拟合到非零像素值的最大连接区域来从感兴趣的中心区域 (ROI) 裁剪图像。


import numpy as np

import cv2


def create_ellipse(thresh,cnt):

    ellipse = cv2.fitEllipse(cnt) #ここでエラーが出る

    thresh = cv2.ellipse(thresh,ellipse,(0,255,255),2) 

    return thresh


def rgb_to_gray(src):

     b, g, r = src[:,:,0], src[:,:,1], src[:,:,2]

     gray = 0.2989 * r + 0.5870 * g + 0.1140 * b

     return gray   



im = cv2.imread('AMD1.png')


gray = rgb_to_gray(im)

gray = cv2.convertScaleAbs(gray)


cv2.imwrite("gray.png", gray)


height = im.shape[0]

width = im.shape[1]

cnt = (width/2, height/2)


im = np.float32(im)

thresh = create_ellipse(im,cnt)

虽然我执行了上面的代码,但我得到了如下所示的错误。


error                                     Traceback (most recent call last)

<ipython-input-46-9f83929ab8df> in <module>()

     37 im = np.float32(im)

---> 38 thresh = create_ellipse(im,cnt)


<ipython-input-46-9f83929ab8df> in create_ellipse(thresh, cnt)

      3 

      4 def create_ellipse(thresh,cnt):

----> 5     ellipse = cv2.fitEllipse(cnt) 

      6     

      7     #ex : cv2.ellipse(img, (width/2-200, height/2-300), (100, 50), 0, 0, 360, (0, 0, 255), 10)


error: OpenCV(3.4.3) /io/opencv/modules/imgproc/src/shapedescr.cpp:305: error: (-215:Assertion failed) n >= 0 && (depth == CV_32F || depth == CV_32S) in function 'fitEllipse'


MM们
浏览 537回答 1
1回答

守着星空守着你

cv2.fitEllipse(...)&nbsp; &nbsp; fitEllipse(points) -> retval&nbsp; &nbsp; .&nbsp; &nbsp;@brief Fits an ellipse around a set of 2D points.&nbsp; &nbsp; .&nbsp; &nbsp; .&nbsp; &nbsp;The function calculates the ellipse that fits (in a least-squares sense) a set of 2D points best of&nbsp; &nbsp; .&nbsp; &nbsp;all. It returns the rotated rectangle in which the ellipse is inscribed. The first algorithm described by @cite Fitzgibbon95&nbsp; &nbsp; .&nbsp; &nbsp;is used. Developer should keep in mind that it is possible that the returned&nbsp; &nbsp; .&nbsp; &nbsp;ellipse/rotatedRect data contains negative indices, due to the data points being close to the&nbsp; &nbsp; .&nbsp; &nbsp;border of the containing Mat element.&nbsp; &nbsp; .&nbsp; &nbsp; .&nbsp; &nbsp;@param points Input 2D point set, stored in std::vector\<\> or Mat这是一个演示:#!/usr/bin/python3# 2018/12/25import cv2img = cv2.imread('test.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)th, threshed = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)## findContours, then fitEllipse for each contour.## 使用 cv2.findContours(...)[-2:] 对 2.x|3.x|4.x 兼容cnts, hiers = cv2.findContours(threshed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]for cnt in cnts:&nbsp; &nbsp; ellipse = cv2.fitEllipse(cnt)&nbsp; &nbsp; cv2.ellipse(img, ellipse, (255,0, 255), 1, cv2.LINE_AA)cv2.imwrite("dst.png", img)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python