使用 fitEllipse 对图像进行椭圆拟合 [英] Ellipse fitting for images using fitEllipse
本文介绍了使用 fitEllipse 对图像进行椭圆拟合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
使用 OpenCV fitEllipse,我想对 3900 × 3072 png 图像(Python 3.6.7)进行椭圆拟合.
作为输入图像,我使用 AMD 14 目录中的图像,该目录分布在
Using OpenCV fitEllipse, I'd like to perform ellipse Fitting of 3900 × 3072 png images (Python 3.6.7).
As the input image, I'm using the images inside the AMD 14 directory, which is distributed at the following site.
Eventually I'd like to create a mask to crop the image from central region of interest (ROI), by fitting an ellipse shape to the largest connected region of non-zeros pixel values.
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)
Although I executed the above code, I got an error like the one below.
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'
解决方案
cv2.fitEllipse(...)
fitEllipse(points) -> retval
. @brief Fits an ellipse around a set of 2D points.
.
. The function calculates the ellipse that fits (in a least-squares sense) a set of 2D points best of
. all. It returns the rotated rectangle in which the ellipse is inscribed. The first algorithm described by @cite Fitzgibbon95
. is used. Developer should keep in mind that it is possible that the returned
. ellipse/rotatedRect data contains negative indices, due to the data points being close to the
. border of the containing Mat element.
.
. @param points Input 2D point set, stored in std::vector\<\> or Mat
Here is a demo:
#!/usr/bin/python3
# 2018/12/25
import cv2
img = 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:
ellipse = cv2.fitEllipse(cnt)
cv2.ellipse(img, ellipse, (255,0, 255), 1, cv2.LINE_AA)
cv2.imwrite("dst.png", img)
这篇关于使用 fitEllipse 对图像进行椭圆拟合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文