import cv2
import numpy
import numpy as np
# 读取彩色图片
img = cv2.imread('C:\\Users\\MJY\\Desktop\\red3.jpg')
gimg = cv2.medianBlur(img, 3)
kernel = np.ones((10, 10))
gimg = cv2.cvtColor(gimg, cv2.COLOR_BGR2GRAY)
cv2.imshow('灰度图', gimg)
# ret, bimg = cv2.threshold(gimg, 200, 255, cv2.THRESH_BINARY)
edged = cv2.Canny(gimg,75,200)
cv2.imshow('edged', edged)
# edged2 = cv2.morphologyEx(edged, cv2.MORPH_OPEN, kernel)
# edged2 = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
edged2 = cv2.dilate(edged, kernel, iterations=1)
cv2.imshow('edged2', edged2)
#
# 确保至少发现一个圆
circles = cv2.HoughCircles(edged2, cv2.HOUGH_GRADIENT, 1,
100, param1=100, param2=10, minRadius=5, maxRadius=100)
# circles = np.uint16(np.around(circles))
print(circles)
for i in circles[0,:]:
# draw the outer circle
cv2.circle(gimg,(i[0],i[1]),i[2],(255,255,0),2)
# draw the center of the circle
cv2.circle(gimg,(i[0],i[1]),2,(255,255,0),3, )
cv2.imshow('detected circles',gimg)
cv2.waitKey(0)
上述在检测圆之前先用了中值滤波、灰度化、canny边缘检测、膨胀运算,然后运用霍夫圆检测
膨胀运算可以改为闭运算,检测出外圆轮廓更符合实际大小。因为膨胀操作会放大白色从而侵蚀圆的范围。
但是值得注意的一点是,进行开运算会报错,暂时不知道是为什么。
使用开运算的效果如下