一、图像基本处理
通常我们获取到的原始图像包含了比较多的背景噪声,影响我们对目标的提取,因此在进行变换前,我们会采取一些预处理方法对图像进行增强,如:
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()
四、实验效果
原始图像:
检测后图像:
光斑检测:
原始图像
边缘检测后效果:
最终结果: