python下用OpenCV的圆形检测

Posted CosmosbipinnatusCav

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python下用OpenCV的圆形检测相关的知识,希望对你有一定的参考价值。

 一.简介:

初次使用python的你一定感受到了python的便捷。作为高级编程语言只需调用类库即可。

对于圆形物体识别问题,opencv提供了大量方法。

代码文末附上

二.检测步骤:

2.1读取图像

窗口1(初始图像未经过处理)

 

2.2降噪处理

由于图像中存在大量噪点(什么是噪点参考https://www.zhihu.com/question/23877970

利用降噪方法cv2.blur(img, (5,5))

其中两个参数为横向纵向的模糊程度,数值越大越模糊

这是55的模糊程度

 

这是2020的模糊程度

 

这里我们用55效果测试下来最佳

2.3灰度化

灰度化常用于色彩丰富的图像,类似ps中的失色操作。

方法:cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)

 

由于原图像就是黑白主色调,所以去色改变不大

2.4霍夫变化圆检测

之前的降噪和灰度化都是为了这一步的检测

参考文章http://lib.csdn.net/article/opencv/24037

方法如下:

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

参数1 image:传递图像

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

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

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

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

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

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

那么什么是canny算法呢?简单来说就是边缘检测算法

具体实现效果可以参考方法:cv2.Canny(img, 27, 54),显示效果为

 

加大参数边缘就越少,我们用到的就是这种效果,即设置上限为80

cv2.Canny(img, 40, 80)

最终

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

会将所有识别的圆形参数(圆心位置,半径)保存到circles

可以认为是一个数组中

2.5标记

根据2.4获取的图像信息利用cv2.circle()方法进行圈画

大功告成,可以调整参数达到满意的效果。

三.附上代码

# -*- coding: utf-8 -*-
import  cv2
#载入并显示图片
img=cv2.imread(\'1.jpg\')
cv2.imshow(\'1\',img)
#降噪(模糊处理用来减少瑕疵点)
result = cv2.blur(img, (5,5))
cv2.imshow(\'2\',result)
#灰度化,就是去色(类似老式照片)
gray=cv2.cvtColor(result,cv2.COLOR_BGR2GRAY)
cv2.imshow(\'3\',gray)

#param1的具体实现,用于边缘检测    
canny = cv2.Canny(img, 40, 80)   
cv2.imshow(\'4\', canny)  


#霍夫变换圆检测
circles= cv2.HoughCircles(gray,cv2.HOUGH_GRADIENT,1,50,param1=80,param2=30,minRadius=15,maxRadius=20)
#输出返回值,方便查看类型
print(circles)

#输出检测到圆的个数
print(len(circles[0]))

print(\'-------------我是条分割线-----------------\')
#根据检测到圆的信息,画出每一个圆
for circle in circles[0]:
    #圆的基本信息
    print(circle[2])
    #坐标行列(就是圆心)
    x=int(circle[0])
    y=int(circle[1])
    #半径
    r=int(circle[2])
    #在原图用指定颜色圈出圆,参数设定为int所以圈画存在误差
    img=cv2.circle(img,(x,y),r,(0,0,255),1,8,0)
#显示新图像
cv2.imshow(\'5\',img)

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

以上是关于python下用OpenCV的圆形检测的主要内容,如果未能解决你的问题,请参考以下文章

Python+opencv 机器视觉 - 基于霍夫圈变换算法检测图像中的圆形实例演示

Python opencv进行圆形识别(圆检测)

python [圆形retangular]用于面部检测的电影式边界框#opencv #boundingbox

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

opencv 检测图片中圆形物体(解决乱线问题)

教你用OpenCV 和 Python实现圆物检测