opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

这篇具有很好参考价值的文章主要介绍了opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、检测需求

对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。
opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

二、问题分析

上图为灰度图,黑色部分为电路板路线,其存在缺口、断路、毛刺、短路等缺陷。这些缺陷有的属于白色缺陷,有的属于黑色缺陷,但都属于小面积缺陷。故,可以使用opencv中的形态学算法,如:腐蚀、膨胀、开运算、闭运算等方法提取这些小面积缺陷。
解决问题的核心思想如下:
用开运算检测毛刺和短路(开运算会消除小面积的白色区域),用闭运算检测缺口和断路(闭运算会消除小面积的黑色区域),开运算与闭运算所的消除结果之和为全部缺陷。

三、基本实现步骤

1、读取图像为灰度图 【imread(“filename”,0),0:灰度图模式】
2、进行开运算与闭运算 【通过形态学操作使缺陷位置发生变化】
3、通过开运算与闭运算结果获取各类缺陷 【将原图与变化结果对比得到缺陷区域灰度图】
4、将缺陷结果进行二值化 【二值化阈值要适度调整】
5、查找二值化结果轮廓画到原图上 【绘图时画笔类型要与图像类型一致】

四、实现过程

4.1 开运算缺陷检测

进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】。
注释:进行开运算后会移除原图中的白色部分,原图中白色区域比开运算结果多,故用原图去减开运算结果

Mat img=imread("C:\\Users\\aaa\\Desktop\\pcb缺陷检测.png",0);
 
//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】
Mat  open_mat, open_mat_defect;
cv::Mat element  = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));
morphologyEx(img, open_mat, MORPH_OPEN, element);
open_mat_defect = img - open_mat;
imshow("开运算", open_mat); 
imshow("原图-开运算", open_mat_defect); 

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)
opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

4.2 闭运算缺陷检测

进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】
注释:进行闭运算后会移除原图中的黑色部分,闭运算结果图中白色区域比原图多,故用闭运算结果去减原图

//进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】
Mat close_mat, close_mat_defect;
cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5,  5));
morphologyEx(img, close_mat, MORPH_CLOSE, element2);
close_mat_defect =  close_mat- img;
imshow("闭运算", close_mat);
imshow("闭运算-原图", close_mat_defect);

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)
opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

4.3 缺陷二值化

闭运算缺陷和开运算缺陷叠加,然后二值化。二值化的阈值要根据效果调整

//闭运算缺陷和开运算缺陷叠加,然后二值化
Mat defect_2zh;
Mat defect = open_mat_defect + close_mat_defect;
threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);
imshow("所有缺陷", defect);
imshow("缺陷二值化", defect_2zh);

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

4.4 缺陷绘图

将检测出的缺陷绘制在原图上,这里需要注意的是原图被读取为灰度图,想绘制彩色,故需要将其从灰度图转换为彩色图BGR模式。

//将检测出的缺陷绘制在原图上
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换
//遍历所有轮廓,绘制缺陷轮廓
for (int i = 0; i < contours.size(); i++)
{
	//绘制轮廓  
	drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);
}

imshow("原图缺陷", img);

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

4.5 完整代码

/*
	  对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。
	  核心思想:用开运算检测毛刺,用闭运算检测缺口,开运算与闭运算结果之和为全部缺陷
	  基本步骤:
			1、读取图像为灰度图 【imread("filename",0),0:灰度图模式】
			2、进行开运算与闭运算 【通过形态学操作使缺陷位置发生变化】
			3、通过开运算与闭运算结果获取各类缺陷 【将原图与变化结果对比得到缺陷区域灰度图】
			4、将缺陷结果进行二值化 【二值化阈值要适度调整】
			5、查找二值化结果轮廓画到原图上 【绘图时画笔类型要与图像类型一致】
	*/
	Mat img=imread("C:\\Users\\aaa\\Desktop\\pcb缺陷检测.png",0);
	 
	//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】
	Mat  open_mat, open_mat_defect;
	cv::Mat element  = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));
	morphologyEx(img, open_mat, MORPH_OPEN, element);
	open_mat_defect = img - open_mat;
	imshow("开运算", open_mat); 
	imshow("原图-开运算", open_mat_defect); 
	
	//进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】
	Mat close_mat, close_mat_defect;
	cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5,  5));
	morphologyEx(img, close_mat, MORPH_CLOSE, element2);
	close_mat_defect =  close_mat- img;
	imshow("闭运算", close_mat);
	imshow("闭运算-原图", close_mat_defect);

	//闭运算缺陷和开运算缺陷叠加,然后二值化
	Mat defect_2zh;
	Mat defect = open_mat_defect + close_mat_defect;
	threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);
	imshow("所有缺陷", defect);
	imshow("缺陷二值化", defect_2zh);

	//将检测出的缺陷绘制在原图上
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
	cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换
	//遍历所有轮廓,绘制缺陷轮廓
	for (int i = 0; i < contours.size(); i++)
	{
		//绘制轮廓  
		drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);
	}

	imshow("原图缺陷", img);
	waitKey( );

4.6 效果分析

通过对上述结果图分析,发现该算法存在一定程度的误检,具体如下图所示,共存在17处误检。这些误检区域与缺口(黑色的才是线路)存在相同的形态学特征(有个白色的尖尖),使用开运算很难避免该类误检。目前,开运算所能准确检测到的缺口类型缺陷均为线路上缺陷,对于非线路上缺陷均为误检
opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)

五、算法优化

目前算法的误检由开运算导致,均发生在非线路区域,故需要移除由开运算在非线路区域的检测结果。

5.1 优化思路

1.提取非线路区域
2.提取开运算结果
3.移除开运算结果在非线路区域的结果

5.2 优化过程

在优化思路中,提取提取非线路区域是关键操作。非线路区域的特点是,其为图像中黑色较粗的区域;线路区域的特点是,其为图像中黑心较细的区域;这些线条区域与非线条区域基本上都在一个在连通域中。故,不可以使用面积提取,需要使用闭运算来提取图像中黑色较粗的区域。

同时,需要注意闭运算提取的黑色较粗区域可能无法盖住闭运算所检测出的缺陷,故需要对黑色较粗区域进行腐蚀(使白色区域能盖住闭运算所检测出的缺陷)。

核心代码如下所示:

	//----新增:为实现性能优化
	//获取图像中的非线路区域(其特点是比较粗)
	//使用闭运算移除非线路区域
	Mat img_bin, img_bin_close, img_bin_close_dilate;
	threshold(img, img_bin, 0, 255, THRESH_OTSU);
	cv::Mat element_close = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
	morphologyEx(img_bin, img_bin_close, MORPH_CLOSE, element_close);
	img_bin_close = 255 - img_bin_close;//使非线条区域从黑变白
	imshow("img_bin_close", img_bin_close);
	cv::Mat element_dilate = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));
	morphologyEx(img_bin_close, img_bin_close_dilate, MORPH_DILATE, element_dilate);
	imshow("img_bin_close", img_bin_close);

5.2 优化效果及代码

优化后的效果及代码如下所示,可以看到通过上述步骤后消除了大部分的误检。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

#include <iostream>  
#include <vector>
#include <io.h>
#include <stdlib.h>
#include <iostream>
#include <string>
using namespace std;
using namespace cv;
int main() {
	Mat img=imread("C:\\Users\\hpg\\Desktop\\pcb缺陷检测.png",0);

	//----新增:为实现性能优化
	//获取图像中的非线路区域(其特点是比较粗)
	//使用闭运算移除非线路区域
	Mat img_bin, img_bin_close, img_bin_close_dilate;
	threshold(img, img_bin, 0, 255, THRESH_OTSU);
	cv::Mat element_close = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15, 15));
	morphologyEx(img_bin, img_bin_close, MORPH_CLOSE, element_close);
	img_bin_close = 255 - img_bin_close;//使非线条区域从黑变白
	imshow("img_bin_close", img_bin_close);
	cv::Mat element_dilate = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(11, 11));
	morphologyEx(img_bin_close, img_bin_close_dilate, MORPH_DILATE, element_dilate);
	imshow("img_bin_close", img_bin_close);
	
	//进行开运算,将原图与开运算结果作差,得到白色缺陷【缺口和断路】
	Mat  open_mat, open_mat_defect;
	cv::Mat element  = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5,5));
	morphologyEx(img, open_mat, MORPH_OPEN, element);
	open_mat_defect = img - open_mat;
	imshow("开运算", open_mat); 
	imshow("原图-开运算", open_mat_defect); 
	//移除开运算在非线条区域的误检
	open_mat_defect = open_mat_defect - img_bin_close;
	
	//进行闭运算,将闭运算结果与原图作差,得到黑色缺陷【毛刺和短路】
	Mat close_mat, close_mat_defect;
	cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size( 5,  5));
	morphologyEx(img, close_mat, MORPH_CLOSE, element2);
	close_mat_defect =  close_mat- img;
	imshow("闭运算", close_mat);
	imshow("闭运算-原图", close_mat_defect);

	//闭运算缺陷和开运算缺陷叠加,然后二值化
	Mat defect_2zh;
	Mat defect = open_mat_defect + close_mat_defect;
	threshold(defect, defect_2zh, 58, 255, THRESH_BINARY);
	imshow("所有缺陷", defect);
	imshow("缺陷二值化", defect_2zh);

	//将检测出的缺陷绘制在原图上
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(defect_2zh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());
	cvtColor(img, img, cv::COLOR_GRAY2BGR);//原图被读取为灰度图,想绘制彩色,故进行转换
	//遍历所有轮廓,绘制缺陷轮廓
	for (int i = 0; i < contours.size(); i++)
	{
		//绘制轮廓  
		drawContours(img, contours, i, Scalar(0, 0, 255), -1, 8, hierarchy);
	}

	imshow("原图缺陷", img);
	waitKey( );
}

opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)文章来源地址https://www.toymoban.com/news/detail-432867.html

到了这里,关于opencv 六 缺陷检测实战2(PCB缺陷检测——小面积缺陷)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [数据集][目标检测]PCB板缺陷目标检测数据集VOC格式693张6类别

    数据集格式:Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):693 标注数量(xml文件个数):693 标注类别数:6 标注类别名称:[\\\"missing_hole\\\",\\\"spurious_copper\\\",\\\"spur\\\",\\\"mouse_bite\\\",\\\"open_circuit\\\",\\\"short\\\"] 每个类别标注的框数: missin

    2024年02月12日
    浏览(40)
  • 基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)

    摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注、记录和保存缺陷位置和类型,以辅助电路板的质检。本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出 P y t h o n 的实现代码以及 P y Q t 的UI界面和训练数据集。在界面

    2024年01月23日
    浏览(48)
  • 基于YOLOv8的PCB缺陷检测系统(Python源码+Pyqt6界面+数据集)

    💡💡💡 本文摘要:基于YOLOv8的PCB缺陷检测系统,并阐述了整个数据制作和训练可视化过程, 最后通过Pyside UI界面进行展示。 博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制

    2024年04月10日
    浏览(70)
  • opencv缺陷检测

    用传统算法,根据实际工程项目,手把手教你做一个最典型的产品缺陷检测项目案例,虽然这个案例与实际生产还存在一定的差距,但是这个检测流程已经很接近实际生产了。 我们先看一下测试结果: 这个检测的主要需求就是,根据视频流中流水线上的产品,通过每一帧图

    2024年02月05日
    浏览(42)
  • 基于yolov5的PCB缺陷检测,引入CVPR 2023 BiFormer:Vision Transformer with Bi-Level Routing Attention提升检测精度

    目录 1.PCB数据集介绍 1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt  1.2 通过voc_label.py得到适合yolov5训练需要的 2.基于Yolov5 的PCB缺陷识别 2.1配置 pcb.yaml  2.2 修改yolov5s_pcb.yaml 2.3 超参数修改train.py 3.实验结果分析 3.1  CVPR 2023 BiFormer: 基于动态稀疏注意力构建高效金字塔

    2024年02月06日
    浏览(48)
  • 复习opencv:螺丝螺纹缺陷检测

    今天收到了一个检测螺牙缺陷的问题,当复习opencv练个手,记录一下基础知识。 这里的代码是检测弯曲的,其他缺陷用yolo处理。 东家给的图片有的是有干扰的(红框标识),所以要求一下最大凸包。 里面很多知识是复习用,最终代码在最后一行,给的101张图片,有2个弯曲度超

    2024年02月15日
    浏览(34)
  • Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别

    目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之六 简单进行人脸训练与识别 一、简单介绍 二、简单进行人脸训练与识别 1、LBPH(Local Binary Patterns Histograms)算法进行人脸训练和识别 2、实现步骤: 3、判断是谁的人脸: 案例中涉及的关键函数说

    2024年04月26日
    浏览(92)
  • 【OpenCV】OpenCV4工业缺陷检测的六种方法

    机器视觉是使用各种工业相机,结合传感器跟电气信号实现替代传统人工,完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成,特别是传统的3C制造环节,产品缺陷检测依赖于人眼睛来发现与检测,不仅费时费力还面

    2024年02月03日
    浏览(45)
  • 使用OpenCV和Python实现缺陷检测的示例代码

    你需要使用cv2.imshow()函数来显示结果。具体来说,你可以使用以下代码来显示结果: 在上面的代码中,\\\'Result’是窗口的名称,img是要显示的图像。cv2.waitKey(0)函数会等待用户按下任意键后关闭窗口。cv2.destroyAllWindows()函数会关闭所有打开的窗口。

    2024年02月12日
    浏览(67)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包