首页 > 编程问答 >如何使用opencv检测该焊条中的缺陷(例如孔)

如何使用opencv检测该焊条中的缺陷(例如孔)

时间:2024-07-31 04:31:32浏览次数:7  
标签:python opencv machine-learning computer-vision

参考图:带孔焊条: https://i.sstatic.net/VaVQX3th.jpg

普通焊条: https://i.sstatic.net/MBcyyIyp.jpg

我在使用 opencv 检测缺陷(例如孔、不均匀性)时遇到问题。我是 opencv 的新手,尝试过轮廓检测、边缘检测,但没有得到想要的结果。我想使用 opencv 构建一个算法来检测这些漏洞并标记它们,而不标记任何其他不必要的东西,这不是缺陷。 这是我在代码中使用的方法

import cv2
import numpy as np
from matplotlib import pyplot as plt

# Load the image
image_path = "sample weld strip.jpg"
image = cv2.imread(image_path)

# Convert the image to HSV color space
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# Define HSV range for the weld strip
lower_hsv = (1, 1, 1)
upper_hsv = (177, 255, 255)

# Apply the HSV mask
mask = cv2.inRange(hsv_image, lower_hsv, upper_hsv)
masked_image = cv2.bitwise_and(image, image, mask=mask)

# Convert to grayscale
gray_image = cv2.cvtColor(masked_image, cv2.COLOR_BGR2GRAY)

# Apply Gaussian blur
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)

# Edge detection using Canny
edges = cv2.Canny(blurred_image, 50, 150)

# Find contours
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Draw bounding boxes around significant contours (holes)
holes_image = image.copy()
for contour in contours:
    area = cv2.contourArea(contour)
    if 10 <area < 25:  # Adjust this threshold based on your needs
        x, y, w, h = cv2.boundingRect(contour)
        cv2.rectangle(holes_image, (x, y), (x+w, y+h), (0, 0, 255), 2)

我正在寻找有关此问题的一些帮助或指导。任何形式的意见或帮助将不胜感激。


我明白你想使用 OpenCV 检测焊条图像中的缺陷(如孔洞)。你目前的代码可以作为起点,但以下是一些改进建议,以及关于如何处理这些缺陷的解释:

  1. 预处理:

  2. 你当前的 HSV 掩码范围似乎过于宽泛,可能包含图像中的非焊条区域。为了更准确地分割焊条,请考虑使用颜色选择器工具来确定其在 HSV 颜色空间中的精确下限和上限值。

  3. 实验不同的去噪技术(如高斯模糊、中值模糊或双边滤波),看看哪种方法最适合你的图像,并有助于突出显示缺陷。

  4. 分割:

  5. 除了 Canny 边缘检测之外,还可以探索其他分割方法,例如:

    • 阈值化: 如果焊条与背景有良好的对比度,可以使用自适应阈值化来创建二值图像,其中焊条像素为白色,背景像素为黑色。
    • 分水岭算法: 这种方法可以有效地分割形状复杂的对象,可用于隔离焊条上的缺陷。
  6. 缺陷检测:

  7. 形态学操作: 在分割后的图像上使用形态学操作(例如开运算或闭运算)可以帮助减少噪声并完善检测到的缺陷的形状。开运算可以去除小的、孤立的像素组,而闭运算可以填补小孔并连接附近的区域。

  8. 基于轮廓的分析: 你可以分析检测到的轮廓的属性(例如面积、周长、圆度)来区分缺陷和误报。例如,孔洞通常具有较小的面积和较高的圆度,而焊条边缘上的不规则性可能具有更大的面积和更低的圆度。
  9. 机器学习: 对于更高级的缺陷检测,请考虑训练机器学习模型(例如支持向量机或卷积神经网络)来对缺陷和非缺陷区域进行分类。这将需要一个标记图像的数据集,用于训练模型。

  10. 标记:

  11. 一旦你识别出缺陷,就可以使用 cv2.rectangle() cv2.drawContours() 函数用边界框或轮廓突出显示它们。你还可以添加文本标签以指示缺陷类型或严重性。

代码示例(使用自适应阈值化和形态学操作):

import cv2
import numpy as np

# 加载图像
image_path = "sample weld strip.jpg"
image = cv2.imread(image_path)

# 预处理:转换为灰度并应用模糊
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)

# 使用自适应阈值化进行分割
thresh = cv2.adaptiveThreshold(blurred_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 11, 2)

# 形态学操作:使用开运算去除噪声
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)

# 查找轮廓
contours, _ = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 分析轮廓并标记缺陷
defects_image = image.copy()
for contour in contours:
    area = cv2.contourArea(contour)
    if 10 < area < 100:  # 根据需要调整此阈值
        x, y, w, h = cv2.boundingRect(contour)
        cv2.rectangle(defects_image, (x, y), (x + w, y + h), (0, 0, 255), 2)

# 显示结果
cv2.imshow("Defects", defects_image)
cv2.waitKey(0)

这只是一个示例,你可能需要根据你的特定图像和应用程序调整参数和方法。建议尝试不同的预处理、分割和缺陷检测技术,以找到最适合你的需求的技术组合。

标签:python,opencv,machine-learning,computer-vision
From: 78813507

相关文章

  • python函数:带星号的参数一个接一个
    我想知道为什么定义以下函数被认为是好的。deffoo(*x,y):pass据我所知,现在有调用此函数的方法,因为它总是缺少y的值。(如果我错了,请纠正我。)这有什么我不知道的用处吗?你说得对,在Python中定义一个像deffoo(*x,y):...这样的函数,在试图以常规方......
  • 基于遗传(GA)、粒子群(PSO)、模拟退火(SA)、禁忌搜索(ST)、蚁群算法(ACO)、自自组织神
        ......
  • 10个append()函数在Python程序开发中的创新应用
    文末赠免费精品编程资料~~在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用,从基本用法到高级技巧,逐步深入。1.构......
  • 全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规
    全网最适合入门的面向对象编程教程:28类和对象的Python实现-Python编程原则、哲学和规范大汇总摘要:本文主要介绍了在使用Python进行面向对象编程时,Python异常处理的原则-“请求谅解,而非许可”,以及软件设计和Python的编程原则,同时介绍了PEP8规范。原文链接:FreakStud......
  • python生成器
    一前言环境:python3.10win10二生成器1关于生成器先看一个例子    定义了一个函数,当我们运行该函数时,并未像普通函数那样执行函数体内的代码    从其中的英文可知,执行函数得到了一个生成器对象,这个生成器对象也叫做generatoriterator(生成器迭代器),generatorit......
  • 生成MySQL-oracle-SQL server数据字典(附Python代码)
    生成数据字典,早年写的,请注意新的版本变化。(1)MySQL元数据SQLUSEinformation_schema;#取出库和表。select  TABLE_SCHEMAAS'数据库名称',  TABLE_NAMEAS'表名',  TABLE_TYPEAS'表类型',  ROW_FORMATAS'行格式',  ENGINEAS'数据库引擎',  TABL......
  • Python - Method Resolution Order (MRO)
    TheorderinwhichPythonsearchesforattributesinbaseclassesiscalledmethodresolutionorder(MRO).Itgivesalinearizedpathforaninheritancestructure.PythoncomputesanMROforeveryclassinthehierarchy;thisMROiscomputedusingthe‘C3......
  • 计算机毕业设计选题推荐-零食批发商仓库管理系统-Java/Python项目实战
    ✨作者主页:IT研究室✨个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。☑文末获取源码☑精彩专栏推荐⬇⬇⬇Java项目Python项目安卓项目微信小程序项目......
  • 【自动化测试必学语言】python:语言基础
    目录Python介绍语言的分类注释单行注释多行注释变量定义变量使用变量变量名的命名规范数据类型数字类型非数字类型type()函数input输入print输出格式化输出快捷键(小操作)运算符算术运算符 比较运算符Python介绍作者:吉多·范罗苏姆(Guidov......
  • Python基础知识笔记——常用函数
    一、range()函数range()函数用于生成一个整数序列。它通常用于循环结构中,例如for循环,以提供循环的迭代次数。range()函数可以有1到3个参数。#range(start,stop,step)range(2,6,2)#生成从2开始,到6结束(不包括6),步长为2的一串数字#参数指定不完全时,默认从0开始,步长......