opencv--检测图片中的圆形


说明

Canny边缘检测+霍夫圆识别图片中的圆形,由于霍夫圆的半径过滤不太稳定,当图中有多个圆时还要自行斟酌,如果是多个半径不同的圆,可以多次使用霍夫圆,并取第一个来识别。但是如果图中有多个半径相似的圆时,有必要转换方法或者提取更多细节来拟合霍夫圆。使用的图片来自:http://www.ihalcon.com/read-1108.html

完整代码

import cv2.cv2 as cv2
import numpy as np
path='a.jpg'
img = cv2.imread(path,0)
gaussimg=cv2.GaussianBlur(img,(3,3),0) #高斯滤波,(3,3)为高斯半径
medianimg = cv2.medianBlur(gaussimg, 7) #中值滤波
cannyimg=cv2.Canny(medianimg,0,148) #canny边缘检测
temp = np.ones(cannyimg.shape,np.uint8)*255 #创建一个空的画布
contours= cv2.findContours(cannyimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
contour = contours[0] #提取轮廓
cv2.drawContours(temp,contour,-1,(0,0,0),3) #把轮廓画到画布上
cv2.imshow('image',temp)
cv2.waitKey(1000)
circle = cv2.HoughCircles(temp,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=10,minRadius=0,maxRadius=800) #按照画布上的轮廓生成霍夫圆
circle = np.uint16(np.around(circle))
img2bgr=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
count=1 #终止信号,只取第一个霍夫圆,试着用数组取了但是没成功
for i in circle[0]:#得到的霍夫圆是默认按照投票结果的累加值排序,一般取第一个就是与轮廓最拟合的那个
#如果有多个圆识别,可以试试用多次霍夫圆,试着用半径过滤到同一块的圆,再取最为拟合的第一个圆,不过这样不稳定
cv2.circle(img2bgr,(i[0],i[1]),i[2],(0,0,255),5) #在图像上画出这个霍夫圆
count+=1
if count==2:
break
cv2.imshow('image',img2bgr)
cv2.waitKey(1000)

相关