【OpenCV】使用Python进行缺陷检测和展示

在工业生产中,为了保证产品质量,通常需要对生产线上的产品进行缺陷检测。在数字图像处理领域,缺陷检测是一个非常重要的应用场景,也是一个比较复杂的问题。本篇文章将介绍如何使用Python和OpenCV库对产品进行缺陷检测,并将结果展示在画布上。


图片数据预处理

首先,我们需要加载所有的图片文件,这些文件通常位于同一个文件夹中,并且文件扩展名为“.jpg”或“.png”。可以使用Python的os和glob模块来实现这一步骤:

import os
import numpy as np
path = './images'
img_files = [os.path.join(path, file) for file in os.listdir(path) if file.endswith('.jpg') or file.endswith('.png')]


接下来,我们需要对每张图片进行缺陷检测。为了提高检测效果,通常需要对图片进行一些预处理,例如转换为灰度图像、二值化处理等。具体操作如下:

import cv2
# 加载原始图像
img = cv2.imread(img_file)
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行二值化处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 进行形态学处理,去除噪点和孤立的小区域
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 寻找轮廓并绘制到原始图像上
contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2)

以上代码中,我们先加载原始图像,然后将其转换为灰度图像,并进行二值化处理。接着使用形态学处理方法对图像进行优化,去除噪点和孤立的小区域。最后,我们使用OpenCV库提供的函数寻找图像中的轮廓,并将其绘制在原始图像上。


展示检测结果

完成缺陷检测之后,我们需要将结果展示在画布上。可以使用Python的matplotlib库来实现这一步骤:

import matplotlib.pyplot as plt
# 创建画布
fig, axs = plt.subplots(nrows=3, ncols=4, figsize=(16, 12))
axs = axs.flatten()
# 对每张图片进行缺陷检测,并在画布上展示结果
for i, img_file in enumerate(img_files):
    # 加载原始图像
    img = cv2.imread(img_file)
    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 对灰度图像进行二值化处理
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    # 进行形态学处理,去除噪点和孤立的小区域
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
    morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    # 寻找轮廓并绘制到原始图像上
    contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
    # 在画布上展示处理结果
    axs[i].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    axs[i].set_title(os.path.basename(img_file))
    axs[i].axis('off')
# 隐藏多余的子图
for i in range(len(img_files), nrows*ncols):
    fig.delaxes(axs[i])
# 显示画布
plt.show()

以上代码中,我们首先创建一个3行4列共12个子图的画布,并对每张图片进行缺陷检测,在画布的相应位置上展示处理结果。最后,我们隐藏多余的子图,以确保画布的展示效果。最后,调用plt.show()函数显示画布。
至此,我们已经实现了图片的缺陷检测和展示。这个方法不仅适用于工业生产中的产品缺陷检测,也可以用于其他领域的图像处理任务。


完整代码如下:

import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
# 加载所有图片文件
path = './01'
img_files = [os.path.join(path, file) for file in os.listdir(path) if file.endswith('.jpg') or file.endswith('.png')]
# 计算画布的行数和列数
nrows = int(np.ceil(len(img_files) / 4))
ncols = min(4, len(img_files))
# 创建画布
fig, axs = plt.subplots(nrows=nrows, ncols=ncols, figsize=(16, nrows*4))
axs = axs.flatten()
# 对每张图片进行缺陷检测,并在画布上展示结果
for i, img_file in enumerate(img_files):
    # 加载原始图像
    img = cv2.imread(img_file)
    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 对灰度图像进行二值化处理
    _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
    # 进行形态学处理,去除噪点和孤立的小区域
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
    morph = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
    # 寻找轮廓并绘制到原始图像上
    contours, _ = cv2.findContours(morph, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
    # 在画布上展示处理结果
    axs[i].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    axs[i].set_title(os.path.basename(img_file))
    axs[i].axis('off')
# 隐藏多余的子图
for i in range(len(img_files), nrows*ncols):
    fig.delaxes(axs[i])
# 显示画布
plt.show()
                                    随着电子产品在各个领域的广泛应用,印刷电路板(PCB)作为电子设备的基础组件,其质量和可靠性变得至关重要。然而,由于制造过程中的复杂性和人为因素的介入,PCB常常会出现各种缺陷,如漏孔、老鼠咬痕、断路、短路、尖角和虚铜等问题。这些缺陷可能导致产品性能下降、故障甚至损坏,对产品质量和生产效率造成严重影响。为了提高PCB制造过程中的缺陷检测效率和准确性,我们展开了这个项目,旨在利用先进的深度学习技术构建一种自动化的PCB缺陷检测系统。
                                    本案例将使用OpenCV C++ 进行PCB印刷缺陷检测。目前缺陷检测算法可分为两大类:一:基于模板匹配的缺陷检测二:基于深度学习的缺陷检测,主要利用目标检测去识别缺陷部分。本文算法主要是基于模板匹配算法进行缺陷检测,参考《基于差异模型的印刷标签缺陷检测算法》一文,进行算法复现,感兴趣的朋友可以去阅读一下原文。本文使用OpenCV C++ 进行PCB印刷缺陷检测,主要操作有以下几点。1、将图像进行仿射变换,与模板图像进行配准2、计算差异图像,得到基于模板的亮、暗阈值图像。
                                    为了方便后面计算,也为了计数方便,我先定义了一个产品类型的结构体myproduct,里面包含外接Rect,质心cx,xy,还有对应索引index. 为了去除重复,每次计算每个轮廓的位置,再根据当前帧里面的所有产品坐标与上一帧图像中产品里面的坐标进行对比,如果有两个产品在上下两帧中偏移的距离很小,那么我们可以认为它是同一件产品,否则就是新出现的产品,就需要放入我们的product容器里面,这其实在实际抓拍检测过程中,比较常用的去重方法:​​​​​​​。我们看一下这个函数的原型:​​​​​​​whaosoft 
                                    使用opencv对PCB进行缺陷检测,具体缺陷类型有开路(断路)、短路、缺口、毛刺。上图为灰度图,黑色部分为电路板路线,其存在缺口、断路、毛刺、短路等缺陷。这些缺陷有的属于白色缺陷,有的属于黑色缺陷,但都属于小面积缺陷。故,可以使用opencv中的形态学算法,如:腐蚀、膨胀、开运算、闭运算等方法提取这些小面积缺陷。
解决问题的核心思想如下:
用开运算检测毛刺和短路(开运算会消除小面积的白色区域),用闭运算检测缺口和断路(闭运算会消除小面积的黑色区域),开运算与闭运算所的消除结果之和为全部缺陷。
                                    上图为灰度图,由网格状排列黑点和大面积的黑点区域(即缺陷)组成,具体**缺陷类型为粘连**,其**形态学特征为 连通域面积较大**。
查找图中缺陷(大面积的黑点)**算法的核心思想为:遍历所有的轮廓,根据面积判断缺陷**,当连通域面积大于一定的值(面积比普通的黑点大),即判断为缺陷,并在原图上标出缺陷轮廓
                                    点到轮廓的距离为正数表示点在轮廓的外部,为负数表示点在轮廓的内部,为零表示点在轮廓上。它会返回一个数组,其中每一行包含的值是[起点,终点,最远的点,到最远点的近似距离]。1.创建一个小程序,可以将图片上的点绘制成不同的颜色,颜色是根据这个点到轮廓的距离来决定的。函数的第一个参数是模板图像的轮廓,第二个参数是目标图像的轮廓,第三个参数是形状匹配方法,第四个参数是匹配时的数值参数。接,在最远点画一个圆圈,要记住的是返回结果的前三个值是轮廓点的索引。函数计算该点到轮廓的距离,根据距离设置点的颜色。
                                    一、项目背景与意义在纺织行业,纺织物缺陷检测是保证产品质量和满足客户要求的重要环节。然而,传统的纺织物缺陷检测方法主要依赖于人工检测,这种方法不仅效率低下,而且容易受到人为因素的影响,导致误检和漏检率较高。随着计算机视觉技术的快速发展,基于图像的缺陷检测方法逐渐成为主流。本项目旨在利用Python编程语言结合OpenCV库,开发一套高效、准确的纺织物缺陷识别系统,以提高纺织物检测的自动化程度和准确性。二、系统原理与工作流程图像采集:使用工业相机或其他图像采集设备,捕获生产线上的纺织物图像。
                                    文章目录问题描述解决方法1	介绍2	方法2.1	产品水平矫正2.2	定位产品的外轮廓2.3	产品对齐2.4	缺陷检测3	实验结果及分析4	讨论
如下图所示为某种用于试剂检验的产品,需要利用机器视觉的方法检测产品的缺陷。 本设计的目的是综合运用图像处理的知识,检测产品是否有严重缺陷。 在检测算法之前, 作为图像的预处理, 检测和定位产品的外轮廓,矫正产品的姿态,对于后续的算法处理有着重要的意义。
数据为真实的工业产品成像,分为放在OK,NG目录下。数据提取地址链接 提取码:s3jl,OK目录下的
import numpy as np
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt
#用于给图片添加中文字符的函数
def cv2ImgAddText(img, text, left
                                    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
                                    在上面的代码中,'Result’是窗口的名称,img是要显示的图像。cv2.waitKey(0)函数会等待用户按下任意键后关闭窗口。cv2.destroyAllWindows()函数会关闭所有打开的窗口。你需要使用cv2.imshow()函数来显示结果。