书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
二、理论基础
3、最小包围圆形
-
在计算轮廓时,可能并不需要确定实际的轮廓,只需要得到一个轮廓的近似多边形。
OpenCV提供了多种计算轮廓近似多边形的方法。 -
函数minEnclosingCircle通过迭代算法构造一个对象面积最小的包围圆形。
4、筛选标准
- 轮廓与原始对象高度拟合,包含的信息非常丰富。
-
通过一个对象的最小包围圆形与其轮廓面积的比值,能够将不规则的圆形筛选出来,从而实现缺陷检测
三、缺陷检测步骤
- 预处理:
该步骤主要是为了方便进行后续处理,主要包含:色彩空间转换处理、阈值处理、形态学处理(开运算)。 - 使用距离交换函数distanceTransform确定距离:
该步骤使用距离变换函数distanceTransform确定每一个像素点距离最近背景点的距离。 - 通过阈值确定前景:
将距离背景点大于一定长度的像素点判定为前景点。 - 去噪处理:
对确定的前景点进行再次处理,去除图像内的噪声信息。本步骤通过开运算完成。 - 提取轮廓:
使用轮廓提取函数提取上述处理结果图像内的轮廓。 - 缺陷检测:
本步骤是程序的核心步骤,主要步骤如下。- 计算面积:
分别计算外接圆面积A和轮廓面积B。 - 面积比较:
计算B:A的比值,并根据比值进行判断。若比值大于阈值T,则说明轮廓与外接圆较一致,认为当前对象是圆形的;
否则,认为当前对象是残缺的,是次品。
- 计算面积:
- 显示结果:
显示最终处理结果。
缺陷检测程序的完整流程图如图所示。
缺陷检测程序的完整流程图
四、缺陷检测程序
运行结果import numpy as np
import cv2
# ====step1 读取图像=====
img = cv2.imread('d:\\pill.jpg')
cv2.imshow("pill",img)
# ====step2 预处理=====
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) #核
opening1 = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 1)
# ====step3 完成距离的计算,确定前景=====
dist_transform = cv2.distanceTransform(opening1,cv2.DIST_L2,3)
ret, fore = cv2.threshold(dist_transform,0.3*dist_transform.max(),255,0)
# ====step4 去噪处理====
kernel = np.ones((3,3),np.uint8)
opening2 = cv2.morphologyEx(fore,cv2.MORPH_OPEN,kernel)
# ====step5 提取轮廓 ====
opening2 =np.array(opening2,np.uint8)
contours,hirearchy=cv2.findContours(opening2,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
# ====step6 缺陷检测 ====
count = 0
font = cv2.FONT_HERSHEY_COMPLEX
for cnt in contours:
(x,y),radius= cv2.minEnclosingCircle(cnt)
center=(int(x),int(y))
radius=int(radius)
circle_img=cv2.circle(opening2,center,radius,(255,255,255),1)
area=cv2.contourArea(cnt)
area_circle=3.14*radius*radius
if area/area_circle>=0.5:
img=cv2.putText(img,'OK',center,font,1,(255,255,255),2)
else:
img=cv2.putText(img,'BAD',center,font,1,(255,255,255),2)
count+=1
img=cv2.putText(img,'sum='+str(count),(20,30),font,1,(255,0,255),2)
# ====step5 显示处理结果 ====
cv2.imshow("result",img)
cv2.waitKey()
cv2.destroyAllWindows()
网友评论