我想测量圆的圆度(“圆”的高度和宽度或椭圆参数之间的差异)。这些圆在图片中给出如下所示:
经过像素灰度化、二值化和边框检测等常规操作,我得到了以下图片:
通过这些,我已经尝试了很多不同的方法:使用findContour进行Watershed分割(类似于这个问题),但OpenCV检测到圆之间的空间作为封闭轮廓而不是圆形,因为它们粘在一起并没有形成封闭轮廓。fitEllipse也有相同的问题,我得到了在黑色背景轮廓上拟合的椭圆而不是在两圆之间拟合的椭圆。即使像代码和第三张图片所示地尝试应用霍夫变换,也会产生奇怪的结果:
代码请见此处:
![](https://istack.dev59.com/04Bxy.webp)
![](https://istack.dev59.com/luhhj.webp)
![](https://istack.dev59.com/gvkcO.webp)
import sys
import cv2
import numpy
from scipy.ndimage import label
# Application entry point
#img = cv2.imread("02_adj_grey.jpg")
img = cv2.imread("fuss02.jpg")
# Pre-processing.
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite("SO_0_gray.png", img_gray)
#_, img_bin = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU | cv2.THRESH_BINARY)
_, img_bin = cv2.threshold(img_gray, 170, 255, cv2.THRESH_BINARY)
cv2.imwrite("SO_1_threshold.png", img_bin)
#blur = cv2.GaussianBlur(img,(5,5),0)
img_bin = cv2.morphologyEx(img_bin, cv2.MORPH_CLOSE, numpy.ones((3, 3), dtype=int))
cv2.imwrite("SO_2_img_bin_morphoEx.png", img_bin)
border = img_bin - cv2.erode(img_bin, None)
cv2.imwrite("SO_3_border.png", border)
circles = cv2.HoughCircles(border,cv2.cv.CV_HOUGH_GRADIENT,50,80, param1=80,param2=40,minRadius=10,maxRadius=150)
print circles
cimg = img
for i in circles[0,:]:
# draw the outer circle
cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
# draw the center of the circle
cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
cv2.putText(cimg,str(i[0])+str(',')+str(i[1]), (i[0],i[1]), cv2.FONT_HERSHEY_SIMPLEX, 0.4, 255)
cv2.imwrite("SO_8_cimg.png", cimg)
有人有改进我的算法或完全不同的方法的想法吗?我尝试了很多不同的方法,但到目前为止都没有成功。感谢大家的帮助。