从给定的椭圆掩码中检测椭圆参数
Detect ellipse parameters from a given elliptical mask
我正在关注 tutorial from the skimage 网站以检测蒙版的边缘,然后获取椭圆周长。
但是,当我 运行 这段代码时,我得到了这个:
我已将 hough_ellipse
函数中的阈值降低到 100,因为这是有效的最高值(有时不适用于其他掩码)并且 min_size
到 10(对于同样的道理)。我没有图像处理或计算机视觉方面的经验,也没有找到任何其他方法来从大量掩码中获取周长。
以下是在 Python/OpenCV 中拟合椭圆的方法。
- 读取输入
- 转换为灰色
- 阈值
- 使椭圆适合形状
- 在输入图像上绘制椭圆
- 保存结果
输入:
import cv2
import numpy as np
# read image
img = cv2.imread('ellipse_shape.png')
hh, ww = img.shape[:2]
# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# threshold to binary and invert
thresh = cv2.threshold(gray, 252, 255, cv2.THRESH_BINARY)[1]
# fit ellipse
# note: transpose needed to convert y,x points from numpy to x,y for opencv
points = np.column_stack(np.where(thresh.transpose() > 0))
hull = cv2.convexHull(points)
((centx,centy), (width,height), angle) = cv2.fitEllipse(hull)
print("center x,y:",centx,centy)
print("diameters:",width,height)
print("orientation angle:",angle)
# draw ellipse on input image
result = img.copy()
cv2.ellipse(result, (int(centx),int(centy)), (int(width/2),int(height/2)), angle, 0, 360, (0,0,255), 2)
# show results
cv2.imshow('image', img)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save results
cv2.imwrite('ellipse_shape_fitted.png', result)
结果椭圆:
椭圆数据:
center x,y: 291.0881042480469 337.10638427734375
diameters: 176.3456573486328 207.72769165039062
orientation angle: 125.05526733398438
从本教程和这张图片我得到了这个参数:
accuracy=50
threshold=50
min_size=100
max_size=100
Hough ellipse example
我正在关注 tutorial from the skimage 网站以检测蒙版的边缘,然后获取椭圆周长。
但是,当我 运行 这段代码时,我得到了这个:
我已将 hough_ellipse
函数中的阈值降低到 100,因为这是有效的最高值(有时不适用于其他掩码)并且 min_size
到 10(对于同样的道理)。我没有图像处理或计算机视觉方面的经验,也没有找到任何其他方法来从大量掩码中获取周长。
以下是在 Python/OpenCV 中拟合椭圆的方法。
- 读取输入
- 转换为灰色
- 阈值
- 使椭圆适合形状
- 在输入图像上绘制椭圆
- 保存结果
输入:
import cv2
import numpy as np
# read image
img = cv2.imread('ellipse_shape.png')
hh, ww = img.shape[:2]
# convert to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# threshold to binary and invert
thresh = cv2.threshold(gray, 252, 255, cv2.THRESH_BINARY)[1]
# fit ellipse
# note: transpose needed to convert y,x points from numpy to x,y for opencv
points = np.column_stack(np.where(thresh.transpose() > 0))
hull = cv2.convexHull(points)
((centx,centy), (width,height), angle) = cv2.fitEllipse(hull)
print("center x,y:",centx,centy)
print("diameters:",width,height)
print("orientation angle:",angle)
# draw ellipse on input image
result = img.copy()
cv2.ellipse(result, (int(centx),int(centy)), (int(width/2),int(height/2)), angle, 0, 360, (0,0,255), 2)
# show results
cv2.imshow('image', img)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
# save results
cv2.imwrite('ellipse_shape_fitted.png', result)
结果椭圆:
椭圆数据:
center x,y: 291.0881042480469 337.10638427734375
diameters: 176.3456573486328 207.72769165039062
orientation angle: 125.05526733398438
从本教程和这张图片我得到了这个参数:
accuracy=50
threshold=50
min_size=100
max_size=100
Hough ellipse example