openCV缺陷检测学习(一)

·参考论文:

《基于OpenCV的PCB元件缺陷检测》-- 郑帅兵,贾小军,季汉华

缺陷检测流程

· 平滑处理
· 图像二值化
· 边缘检测
· 缺陷检测

1.平滑处理

平滑处理也成为模糊处理。通常用来压制,弱化或消除图像中的细节,突变,边缘和噪声。

·论文中选择使用中值滤波的方法进行平滑处理,因为其对脉冲噪声有较好的滤除作用,且边缘不会被模糊。

平滑滤波函数:

void cvSmooth(const CvArr* src,CvArr* dst,int smoothtype = CV_GAUSSIAN,
		int param1,int param2,double param3,double param4)
//src:输入图像
//dst:输出图像
//CV_BLUR_NO_SCALE(简单不带尺度的模糊)--每个像素的param1*param2领域求和
//CV_BLUR(simple blur)--对每个像素param1*param2领域求和并做尺度变换1/(param1*param2)(将平均和/个数 放到中心点)
//CV_GAUSSIAN(guassian blur)--对图像进行核大小为param1*param2的高斯滤波(加权平均和)
//CV_MEDIAN(median blur)--对图像进行核大小为param1*param1的中值滤波(找中间值代替)
//param1-平滑操作的第一个参数
//param2-平滑操作的第二个参数,如果为0,则表示其设定为param1
//param3--对应高斯参数的标准差,如果param1和2为0,核大小有param3计算

相关知识:

平滑处理后:
·图像经滤波处理后清晰度更高
·抽出图像的特征作为图像识别的特征模式

噪声通常有两种:
·椒盐噪声:噪声的幅值基本上相同,但是噪声出现的位置是随机的(中值滤波效果好)
·高斯噪声:每一点都存在噪声,但噪声的幅值是随机分布的(用高斯滤波)

空间滤波技术分类:

1.平滑滤波:
主要用来消除噪声,又可以用在提取较大的目标前过滤去除较小的细节或将目标中的小间断连接起来

2.锐化滤波:
可增加图像反差,让边缘更加明显。实际应用中,可用于增强图像中被模糊的细节或景物的边缘

线性滤波原理:
openCV缺陷检测学习(一)_第1张图片
假设有6X6的图像像素点矩阵。卷积过程,3X3的窗口从左到右,从上到下移动,黄色的每个像素点值之和取平均值赋给中心红色像素点作为卷积处理之后的新像素值
在这里插入图片描述
常用线性滤波:

·高斯滤波:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声。

具体操作: 用一个掩膜扫描图像中每一个像素,用掩膜确定的领域内像素的加权平均灰度值取替代模板中心像素的值。

高斯滤波在保留信号的条件下减少噪声,**对于抑制服从正态分布的噪声非常有效。**但是在接近边缘处会无效。
openCV缺陷检测学习(一)_第2张图片
二维高斯函数:
在这里插入图片描述
API:

void GaussianBlur(InputArray src,      //输入图像
             OutputArray dst,    //输出图像
             Size ksize,       //内核的大小
             double sigmaX,     //高斯核函数在X方向的标准偏差  
             double sigmaY=0,    //高斯核函数在Y方向的标准偏差
             intborderType=BORDER_DEFAULT )  //一般不用管

非线性常用滤波:
中值滤波:

将中心像素的值用所有像素值(邻域窗口内)的中间值(不是平均值)替换。

中值滤波通过选择中间值避免图像孤立噪声点的影响,对脉冲噪声,斑点噪声,椒盐噪声有良好的滤除效果,在一定条件下可以克服线性滤波器带给图像的细节模糊影响。在降噪方面效果也不错

void medianBlur(InputArray src,OutputArray dst,int ksize)

2.阈值分割:

通过阈值分割/图像二值化提取有效部分处理,提高缺陷检测的识别精度和准确度

void cvThreshold(const CvArr* src,CvArr* dst,double threshold,double max_value,int threshold_type)

3.边缘检测:

实验中采用Canny算子提取边缘
Canny算子有如下优点:
1.图像边缘信息的漏检,误检率比较小,整体效果较好
openCV缺陷检测学习(一)_第3张图片

2.实现高精度的定位,location越大越好
在这里插入图片描述

3.响应次数最少,保证只有唯一像素点响应

openCV缺陷检测学习(一)_第4张图片
API:

void cvCanny(const CvArr* image,CvArr* edges,double threshold1.double threshold2,int aperture_size=3)

//threshold:第一个阈值
//threshold2:第二个阈值
//aperture_size:算子内核带下

4.瑕疵检测:

完成了以上步骤后,可以将边缘检测后的PCB元件图像与标准模板PCB图像进行匹配,匹配成功后得到函数的返回值,确定元件是否有缺陷:

Double cvMatchShapes(const void* object1,const void* object2,int method,double parameter = 0);

//其中:
//object1:第一个轮廓或灰度图像
//object2:第二个轮廓或灰度图像
//method:比较方式有以下三种方法:CV_CONTOUR_MATCH_I1,
		//CV_CONTOURS_MATCH_I2,CV_CONTOURS_MATCH_I3,
//Parameter:数值参数,函数匹配完成后会返回一个匹配的数值,表示匹配程度

三种匹配方式分别如下:
openCV缺陷检测学习(一)_第5张图片
在这里插入图片描述

5.实验注意事项:

·模板的选择会影响匹配的结果,如果模板选的太大,对较小的缺陷就会不敏感,太小的话,像素点采集也会不够。实验中采用600

定义一个变量pcbResult,获取函数的返回值。当PCB元件没有缺陷时,pcbResult的值为0,但是实际结果与理论存在一定误差,因此设置临界值为0.2,当值大于0.2时,认为PCB元件存在缺陷

你可能感兴趣的:(opencv)