基于opencv-python的圆形检测

一、图像基本处理

通常我们获取到的原始图像包含了比较多的背景噪声,影响我们对目标的提取,因此在进行变换前,我们会采取一些预处理方法对图像进行增强,如:

1、灰度处理

2、边缘检测,常用Canny算子;

3、进行联通区域处理;

二、霍夫圆变换

opencv-python提供了HoughCircles函数来完成圆形检测及变换。

cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)

参数1 image:传递图像

参数2 method:默认,不用理解

参数3 dp:默认,不用理解

参数4 minDist:不同圆心的最小距离,单位为像素

参数5 涉及到Canny算法,这里的80为canny算法的上限,这里的canny算法下限自动设置为为上限一半,马上介绍canny算法

参数6 需要理解上面的参考文章,可以认为是需要达到的累加数量

参数7,8 为最小半径和最大半径,避免识别白色的圆圈

三、源码

import  cv2

#载入并显示图片
img=cv2.imread('F:/circle/7.jpg')
#cv2.imshow('img',img)
#灰度化
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#输出图像大小,方便根据图像大小调节minRadius和maxRadius
print(img.shape)
#cv2.imshow('gray',gray)

th2 = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
#cv2.imshow('binary', th2)

ret,thresh1 = cv2.threshold(gray,200,255,cv2.THRESH_BINARY)
cv2.imshow('thresh1', thresh1)

canny = cv2.Canny(thresh1,40,80)
cv2.imshow('Canny', canny)


canny=cv2.blur(canny,(3,3))
cv2.imshow('blur',canny)

#霍夫变换圆检测
circles= cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,100,param1=50,param2=30,minRadius=30,maxRadius=150)
#输出返回值,方便查看类型
print(circles)
#输出检测到圆的个数
print(len(circles[0]))

print('-------------我是条分割线-----------------')
#根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
    if (circle[2] >= 100):
        continue
    #圆的基本信息
    print(circle[2])
    #坐标行列
    x=int(circle[0])
    y=int(circle[1])
    #半径
    r=int(circle[2])
    
    #在原图用指定颜色标记出圆的位置
    img=cv2.circle(img,(x,y),r,(0,0,255),-1)
#显示新图像
cv2.imshow('res',img)

#按任意键退出
cv2.waitKey(0)
cv2.destroyAllWindows()

四、实验效果

原始图像:

基于opencv-python的圆形检测_第1张图片

检测后图像:

基于opencv-python的圆形检测_第2张图片

 

光斑检测:

原始图像

基于opencv-python的圆形检测_第3张图片

边缘检测后效果:

基于opencv-python的圆形检测_第4张图片

最终结果:

基于opencv-python的圆形检测_第5张图片

你可能感兴趣的:(基于opencv-python的圆形检测)