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

2023-11-16

目录

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

 图片数据预处理

展示检测结果

效果展示

完整代码如下:


【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()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【OpenCV】用Python进行缺陷检测和展示 的相关文章

  • 在 sympy 绘图中,如何获得具有固定纵横比的绘图?

    如果我用这个片段画一个圆 from sympy import x y symbols x y p1 plot implicit Eq x 2 y 2 1 aspect ratio 1 1 我会得到一个像这样的图形窗口 现在长宽比不是我所期望
  • goJS 下拉菜单删除项目

    我有简单的 python Flask goJS 图形应用程序 如下所示 节点和链接文本的源是从应用程序的后端加载的 我将它们设置为model modelData像这样的部分 var graphDataString JSON parse di
  • 在Linux中的端口80上运行flask[重复]

    这个问题在这里已经有答案了 也许以前有过这个问题的答案 所以请重定向我 如果是这样的话 我正在考虑在端口 80 上运行 Flask 所以我检查了是否有任何东西正在使用端口 80 因为事实证明端口 80 没有运行 所以当我输入以下内容时 if
  • 如何在模型 Django 中创建必需:布尔字段

    我有一个模型 其中有一个名为的字段is student and is teacher Student and Teacher forms is teacher models BooleanField teacher status defau
  • Django 和 AWS 简单电子邮件服务 [重复]

    这个问题在这里已经有答案了 我正在尝试启动并运行 django 站点 并且正在尝试启用 django 的标准密码重置服务 我的网站由 AWS EC2 托管 因此我想将 AWS SES 用于我的电子邮件服务 但是 我无法使 smtp 连接正常
  • 将元组列表转换为字符串 Python

    例如 我用 python 编写了一个返回列表的函数 1 1 2 2 3 3 但我希望输出为字符串 这样我就可以用另一个字符替换逗号 这样输出就是 1 1 2 2 3 3 有什么简单的方法可以解决这个问题吗 感谢您提前提供任何提示 这看起来像
  • 如何让 Discord 机器人显示“机器人正在输入...”状态?

    所以如果我有一个像这样的长命令 bot command pass context True async def longCommand ctx typing status sleep 10 bot say Done 不幸的是 在文档或此处没
  • 在 Pyinstaller、语音识别和 Pyttsx3 中使用“-w”时,PySimpleGUI 中出现“OSError:[WinError 6] 句柄无效”

    所以我用 PySimpleGUI 创建了一个程序 然后用 Pyinstaller 从它创建了 exe 文件 这是我的命令 pyinstaller hidden import pyttsx3 drivers hidden import pyt
  • UTF-8 解码如何知道字节边界?

    我一直在阅读大量有关 unicode 编码的文章 尤其是有关 Python 的文章 我想我现在对此已经有了相当深入的了解 但仍有一个小细节我有点不确定 解码如何知道字节边界 例如 假设我有一个带有两个 unicode 字符的 unicode
  • Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

    我正在从源安装tensorflow 文档 https www tensorflow org versions r0 10 get started os setup html installing from sources Cuda驱动版本
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • Web 应用程序框架:C++ 与 Python

    作为一名程序员 我熟悉 Python 和 C 我正在考虑编写自己的简单 Web 应用程序 并且想知道哪种语言更适合服务器端 Web 开发 我正在寻找一些东西 它必须是直观的 我认识到 Wt 存在并且它遵循 Qt 的模型 我讨厌 Qt 的一件
  • 尝试安装 python 包 Box2D 时出错

    我正在尝试通过 pip 安装 Box2D 软件包的版本 2 3 10 但是 pip 返回以下错误消息 ERROR Could not find a version that satisfies the requirement Box2D 2
  • 并行磁盘 I/O

    我有几个想要阅读的日志文件 不失一般性 假设日志文件处理如下 def process infilepath answer 0 with open infilepath as infile for line in infile if line
  • 使用字体模块的 Tkinter 代码无法从命令行运行?

    我有使用 tkinter 的代码 我可以从 IDLE 运行得很好 但会引发异常AttributeError module object has no attribute font 当它从命令行运行时 其他 tkinter 程序工作正常 但任
  • Kivy错误(python 2.7):sdl2导入错误

    我尝试在我的 Python 2 7 项目 在 PyCharm Windows 10 环境中 上使用 kivy 但出现以下错误 如果有人可以帮助我吗 谢谢 PS 我多次尝试卸载 重新安装库等 并按照像这样的帖子上的建议进行操作 但它不起作用
  • Django - 从时间戳获取不同的日期

    我正在尝试按日期过滤用户 但直到我可以找到数据库中用户的第一个和最后一个日期为止 虽然我可以让我的脚本稍后过滤掉重复项 但我想从一开始就使用 Django 来完成此操作distinct因为它显着减少 我试过 User objects val
  • pygame.image.load 不工作

    我正在尝试为游戏创建世界地图 但是当我尝试将世界地图加载到屏幕上时 命令行告诉我无法执行此操作 这是代码 import sys import pygame from pygame locals import pygame init Surf
  • 如何使 cx-oracle 将查询结果绑定到字典而不是元组?

    这是我的代码 我想找到一种方法将查询结果作为字典列表而不是元组列表返回 看起来 cx oracle 通过部分文档讨论 绑定 来支持这一点 虽然我不知道它是如何工作的 def connect dsn cx Oracle makedsn hos
  • Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

    我有一些时间序列数据作为 Pandas 数据框 它从每小时过去 15 分钟和过去 45 分钟 时间间隔为 30 分钟 的观察开始 然后将频率更改为每分钟 我想对数据进行重新采样 以便整个数据帧的频率为每 30 分钟一次 15 点和 45 点

随机推荐

  • 装饰器在js中的实现原理

    在项目中总是能看到 connect Debounce 巴拉巴拉 通过百度才知道它叫做装饰器 装饰器有什么好 比如说 当我们写好了一个组件它叫做纯洁 当时在创造它的时候我们只想让它做一件事 但是突然有人告诉你我要加一个功能 可是我又不想让我的
  • 医学图像配准软件 ANTs(Advanced Normalization Tools)的安装和使用说明

    本文是关于医学图像配准软件 ANTs Advanced Normalization Tools 的安装和使用说明 ANTs ANTs 是 Advanced Normalization Tools 的缩写 是基于 C 语言的一个医学图像处理的
  • 利用openslide-python处理病理

    参考 博客总结https www jianshu com p bd5b572b5269 官方文档 https openslide org api python module openslide 获取元信息 如每个像素有多少微米 import
  • 杭电ACM 第2036题

    include
  • Linux 定时备份mysql数据并同步到其他mysql服务器中

    备份还原操作 导出数据库 usr bin mysqldump u root pwd database gt database sql 导入数据库 mysql u root p database lt database sql 备份到压缩文件
  • Android 实现WebView

    activity main xml
  • Git首次提交代码到仓库步骤(资料)

    第一步 登陆码云 第二步 创建一个 新的项目 第三步 创建成功后到这个页面 Git 全局设置 git config global user name 意米 git config global user email 142453222851
  • 数据结构<1>时间复杂度详解和leetcode例题

    文章目录 什么是时间复杂度和空间复杂度 前言 算法效率 时间复杂度的计算 空间复杂度的计算 oj练习 什么是时间复杂度和空间复杂度 前言 算法效率 算法效率分析分为两种 第一种是时间效率 第二种是空间效率 时间效率被称为时间复杂度 而空间效
  • Java与WCF交互(一):Java客户端调用WCF服务

    第一步 生成WCF服务 新建WCF解决方案 分别添加三个项目 HelloTimeService 类库 HelloTimehost 控制台程序 HelloTimeClient 控制台程序 项目结构如图 各个项目的主要代码 service Ho
  • 无人机的基本知识

    一 无人机的定义 无人驾驶飞机是指由动力驱动 不搭载操作人员的一种空中飞行器 它依靠空气动力为飞行器提供升力 能够自主或遥控飞行 能携带多种任务设备 执行多种任务 可一次性或多次重复使用的无人驾驶航空器 简称无人机 Unmanned Aer
  • Java Web JSP开发模型

    看之前先点赞 1 JSP开发模型 为了方便使用JSP技术 SUN公司玮JSP技术提供了两种开发模型 JSP Mode1 和 JSP Mode2 JSP Mode1 JSP Mode2 我们将按照Model2思想来完成用户注册功能 1 创建项
  • LUA延时控制

    LUA延时控制 与C 交互实现 其它可参考方式 Lua封装延时执行函数 LUA的延时调用功能 Sleep Function 与C 交互实现 通过C 提供Sleep函数给LUA调用即可 可以任意实现 比如超过5秒再提示相应倒计时功能 if f
  • 听说你搞过架构设计?来,我这里有个系统设计一下...

    V xin ruyuan0330 获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 选择性订阅部分核心数据 三 RabbitMQ的queue与exchange的绑定回顾 四 direct exchange实现消息路由 五 按需订
  • 【云原生

    目录 K8s 控制器 Replicaset 一 Replicaset 控制器 概念 原理解读 1 1 Replicaset 概述 1 2 Replicaset 工作原理 如何管理 Pod 二 Replicaset 资源清单文件编写技巧 三
  • centos 启用远程日志功能_CentOS7下搭建Rsyslog Server记录远程主机系统日志

    rsyslog是一个快速处理收集系统日志的开源程序 提供了高性能 安全功能和模块化设计 rsyslog 是syslog 的升级版 它将多种来源输入输出转换结果到目的地 rsyslog被广泛用于Linux系统以通过TCP UDP协议转发或接收
  • yaml数组解析_YAML详解

    1 YAML简介 YAML 即YAML Ain t Markup Language的缩写 YAML 是一种简洁的非标记语言 YAML以数据为中心 使用空白 缩进 分行组织数据 从而使得表示更加简洁易读 YAML的在线Demo这个YAML转化
  • 使用卷积神经网络(CNN)算法进行多变量时间序列预测的实战教程(Python)

    使用卷积神经网络 CNN 算法进行多变量时间序列预测的实战教程 Python 深度学习在多变量时间序列预测中展现了广泛的应用前景 其中卷积神经网络是最为经典的算法之一 本篇文章将通过一个实例 介绍如何使用卷积神经网络算法来预测交通流量情况
  • 21道常见Transformer面试题(GPT4帮你搞定)

    最近看到一篇关于Transfomer的面试题 写的挺好的 美中不足的是回答的有点简单 刚好我PLUS还没过期 就想着将问题放给无所不能的GPT4来解答 有什么问题欢迎留言私信我好及时修改 不能误人子弟嘿嘿 接下来一起瞧瞧吧 目录部分 按需查
  • Android学习之路3——数据库SQLite的使用以及Android申请权限

    Android学习之路3 数据库SQLite的使用以及Android申请权限 一 实验题目 数据存储 学习SQLite数据库的使用 学习ContentProvider的使用 复习Android的界面编程 二 实现内容 进入程序 可以选择单选
  • 【OpenCV】用Python进行缺陷检测和展示

    目录 OpenCV 使用Python进行缺陷检测和展示 图片数据预处理 展示检测结果 效果展示 完整代码如下 OpenCV 使用Python进行缺陷检测和展示 在工业生产中 为了保证产品质量 通常需要对生产线上的产品进行缺陷检测 在数字图像