欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv--检测图片中的圆形

程序员文章站 2024-01-28 10:01:16
...

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)

运行结果

原图:
opencv--检测图片中的圆形
运行结果:
opencv--检测图片中的圆形
opencv--检测图片中的圆形