写在文章前
这些天因为工作需要要学习图像检测,笨笨的我啥都不会要盯着OpenCV重头开始学(;′⌒`),甚至查资料能力都很弱弱〒▽〒
夸一下我最好的男票(*^▽^*) 男盆友也不是做图像处理的 但是心疼我的笨(〃‘▽‘〃)
让我把要求给他(っ??ω??)っ??? 他放下手中的游戏 花了一两天给我做出来然后写了份详细说明书φ(>ω<*)
当然是记下来 ?(?????)?
??▽ ???3?? 学习去咯
一.简介:
初次使用python的你一定感受到了python的便捷。作为高级编程语言只需调用类库即可。
对于圆形物体识别问题,opencv提供了大量方法。
(代码文末附上)
二.检测步骤:
2.1读取图像
窗口1(初始图像未经过处理)
2.2降噪处理
由于图像中存在大量噪点(什么是噪点参考https://www.zhihu.com/question/23877970)
利用降噪方法cv2.blur(img, (5,5))
其中两个参数为横向纵向的模糊程度,数值越大越模糊
这是5,5的模糊程度
这是20,20的模糊程度
这里我们用5,5效果测试下来最佳
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:不同圆心的最小距离,单位为像素
参数5 涉及到Canny算法,这里的80为canny算法的上限,这里的canny算法下限自动设置为为上限一半,马上介绍canny算法
参数6 需要理解上面的参考文章,可以认为是需要达到的累加数量
参数7,8 为最小半径和最大半径,避免识别白色的圆圈
那么什么是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()