随着机器学习的发展,对于工业产品的缺陷检测,深度网络模型检测缺陷的准确率远远高于传统图像处理算法。现在一般的做法是将传统图像技术作为预处理,或者将传统提取特征与网络深度特征相结合进一步提高准确率。

今天整理以前资料,突然看到几年前初识图像处理时做的小东西,现在看简直弱爆了,用图像处理基本操作实现工业产品缺陷检测。以此记录下初心,作为第一篇博客。(当时比较水,请勿吐槽(_))

1.屏幕坏点

屏幕坏点的检测种类不同,最简单有黑底白点检测和白底黑点检测。对于白色坏点,先采取形态学基本运算膨胀,并通过调整内核尺寸的大小,来改变白点膨胀的程度。然后调用寻找轮廓函数,统计坏点的个数。对于黑色坏点,先采取腐蚀运算,使黑色坏点的面积变大,同样调用寻找轮廓函数统计坏点个数。对于坏点的位置,计算轮廓的内接矩形,寻找中心点即可。

2.瓷砖裂纹

一般瓷砖的缺陷也分为两种,一种为擦痕,近似白色,另一种为裂纹,颜色较深。对于白色擦痕,可以首先进行膨胀,使白色擦痕变得明显些,然后进行二值化,并通过滑动条控制阈值和二值化方式,之后进行中值滤波去噪点,再经过腐蚀之后的图片,用Canny进行边缘检测,通过寻找并绘制轮廓,即可将白色擦痕用黑色线条圈出。

对于黑色裂纹,如果有标准瓷砖花纹,将标准图和缺陷图同时进行腐蚀,使黑色裂纹变得明显些,然后二值化,中值滤波之后进行膨胀,同时对两张图进行Canny边缘检测,接着对标准图进行寻找轮廓,并将各个轮廓的面积和长度存到二维点集中。然后对缺陷图寻找轮廓,通过循环比对标准图轮廓的特征,即可用黑色线条绘制出裂纹的轮廓。

工业图像无监督异常检测中的深度学习综述 图像处理工业缺陷检测_工业图像无监督异常检测中的深度学习综述

3.PCB检测

由于PCB的复杂性,可以分类处理电路板块。对于元件的焊接位置,如贴焊的小芯片阵,可以采取模板匹配的方式,循环检测出与模板匹配度最高的正确芯片焊接处,设定相似度阈值,把不正确的地方用红框标注出来。

对于元件的数量检测,例如大芯片和电容,可以先采取图像预处理,然后边缘检测等寻找元件面积,长度等其他特征,并设定参数,统计元件的数量。

对于焊接不当,多锡,缺锡的情况,基于其亮度对比,引脚特征等因素,用图像预处理,二值化,形态学基本运算等,并结合边缘检测后的轮廓特征,设定参数,将缺陷之处标识出来。

总结

由于都是基本操作,每个完整的代码就不贴了,由于简单,结果图都挺不错的,贴几个常用的函数吧,当时还是用的Opencv C++:

getStructuringElement(MORPH_RECT,Size(200,200))#返回指定形状和尺寸的结构元素
dilate(src,src,element);#膨胀
erode(dst,dst,element);#腐蚀
findContours(mid,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);#寻找轮廓
threshold(gray,tmp,thresholdvalue,255,thresholdtype);#二值化
medianBlur(tmp,dst,7);#中值滤波
Canny(dst1,canny_output1,150,300,3);#边缘检测
m=contourArea(contours[i]);#计算轮廓面积
k=arcLength(contours[i],true);#计算轮廓长度
drawContours(src, contours, j, color, 2, 8, hierarchy, 0, Point());#绘出轮廓