python 圆形检测_基于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()

四、实验效果

原始图像:

检测后图像:

光斑检测:

原始图像

边缘检测后效果:

最终结果:

你可能感兴趣的:(python,圆形检测)