机器视觉-2 缺陷检测常见场景与常用检测方法

news2024/9/21 8:03:44

目录

目录

一、缺陷检测常见场景

二、缺陷检测常用方法

1. 单调背景

方法1: 阈值分割

方法2: 差分法

2. 规则纹理背景

方法1: 模板匹配

方法2: Gabor滤波器

方法3:傅里叶变换

3. 无规则图像

方法1: 边缘检测 + 轮廓检测

方法2: 图像分割(如Watershed算法)

方法3: 机器学习或深度学习方法

总结


 

 

一、缺陷检测常见场景

        根据背景和图像特征的不同,可以将主要缺陷检测场景分为三类:

单调背景图像:通常是指图像背景较为简单,颜色或亮度比较均匀。这种情况下,缺陷通常表现为与背景明显不同的区域。

b9128dcf739147d191edcba8928b2b0e.png

规则纹理背景:规则纹理背景指图像中具有重复的纹理或图案,缺陷表现为纹理中断或异常。

b0c70131d0dd4d419b6239c94ed87c8d.png

无规则图像背景:无规则图像指背景复杂多变,没有明显的规则或模式。在这种情况下,缺陷检测需要更加复杂的处理方法。

96c8063218544c0a8ed9a35f688c2ed7.png

每种背景类型的缺陷检测方法各有侧重。

二、缺陷检测常用方法

1. 单调背景

方法1: 阈值分割

阈值分割适用于背景单一且缺陷与背景有明显差异的情况。

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

using namespace cv;
using namespace std;

int main() {
    Mat src = imread("image_path");
    if(src.empty()) {
        cerr << "Image load failed!" << endl;
        return -1;
    }

    Mat gray, binary;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    threshold(gray, binary, 128, 255, THRESH_BINARY);

    imshow("Binary Image", binary);
    waitKey(0);

    return 0;
}

方法2: 差分法

差分法可以通过对比待检测图像与参考图像(无缺陷图像)的差异来检测缺陷。

Mat diff;
absdiff(src, ref_image, diff); // ref_image 是无缺陷的参考图像
threshold(diff, diff, 50, 255, THRESH_BINARY);

2. 规则纹理背景

方法1: 模板匹配

模板匹配适合在规则纹理中寻找缺陷,尤其是在纹理中某一部分出现异常时。

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

using namespace cv;
using namespace std;

int main() {
    Mat src = imread("image_path");
    Mat templ = imread("template_path");

    Mat result;
    matchTemplate(src, templ, result, TM_CCOEFF_NORMED);
    threshold(result, result, 0.8, 1.0, THRESH_BINARY);

    imshow("Template Matching", result);
    waitKey(0);

    return 0;
}

方法2: Gabor滤波器

Gabor滤波器能够有效地检测图像中的特定频率和方向的纹理,可以用于检测规则纹理中的缺陷。

// --- Gabor 滤波器 ---
Mat applyGaborFilter(const Mat& image) {
    Mat gaborKernel = getGaborKernel(Size(21, 21), 5, CV_PI / 4, 10, 0.5, 0, CV_32F);
    Mat filteredImage;
    filter2D(image, filteredImage, CV_8UC3, gaborKernel);
    return filteredImage;
}

方法3:傅里叶变换

傅里叶变换将图像从空间域转换到频域,能够分析图像中的周期性纹理特征。对于规则纹理图像,傅里叶变换可以清晰显示出图像中的周期性模式,通过识别频谱中的异常(如噪声或不规则峰值),可以快速定位纹理中的缺陷。特别是在规则重复纹理(如纺织品、印刷品)中,傅里叶变换非常有效。

// --- 傅里叶变换 ---
void applyFourierTransform(const Mat& image, Mat& magnitudeSpectrum, Mat& inverseImage) {
    Mat padded;                            
    int m = getOptimalDFTSize(image.rows);
    int n = getOptimalDFTSize(image.cols); 
    copyMakeBorder(image, padded, 0, m - image.rows, 0, n - image.cols, BORDER_CONSTANT, Scalar::all(0));

    Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
    Mat complexI;
    merge(planes, 2, complexI);         

    dft(complexI, complexI);            

    split(complexI, planes);           
    magnitude(planes[0], planes[1], planes[0]);
    magnitudeSpectrum = planes[0];

    magnitudeSpectrum += Scalar::all(1);                     
    log(magnitudeSpectrum, magnitudeSpectrum);

    magnitudeSpectrum = magnitudeSpectrum(Rect(0, 0, magnitudeSpectrum.cols & -2, magnitudeSpectrum.rows & -2));
    int cx = magnitudeSpectrum.cols / 2;
    int cy = magnitudeSpectrum.rows / 2;

    Mat q0(magnitudeSpectrum, Rect(0, 0, cx, cy));   
    Mat q1(magnitudeSpectrum, Rect(cx, 0, cx, cy));  
    Mat q2(magnitudeSpectrum, Rect(0, cy, cx, cy));  
    Mat q3(magnitudeSpectrum, Rect(cx, cy, cx, cy)); 

    Mat tmp;                           
    q0.copyTo(tmp);
    q3.copyTo(q0);
    tmp.copyTo(q3);

    q1.copyTo(tmp);
    q2.copyTo(q1);
    tmp.copyTo(q2);

    normalize(magnitudeSpectrum, magnitudeSpectrum, 0, 1, NORM_MINMAX);

    Mat invDFT, invDFTcvt;
    dft(complexI, invDFT, DFT_INVERSE | DFT_REAL_OUTPUT); 
    normalize(invDFT, inverseImage, 0, 1, NORM_MINMAX);
}

3. 无规则图像

方法1: 边缘检测 + 轮廓检测

通过边缘检测来提取图像中的边缘,再结合轮廓检测来识别不规则的缺陷区域。针对特定场景也可尝试使用差分法。

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

using namespace cv;
using namespace std;

int main() {
    Mat src = imread("image_path");
    Mat gray, edges;

    cvtColor(src, gray, COLOR_BGR2GRAY);
    Canny(gray, edges, 100, 200);

    vector<vector<Point>> contours;
    findContours(edges, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    Mat result = src.clone();
    drawContours(result, contours, -1, Scalar(0, 0, 255), 2);

    imshow("Contours", result);
    waitKey(0);

    return 0;
}

方法2: 图像分割(如Watershed算法)

针对复杂背景,可以采用图像分割算法来分割不同区域,并在这些区域中寻找异常的部分。

Mat markers = Mat::zeros(src.size(), CV_32S);
// 需要先手动或通过其他方法设定 markers 的初始值
watershed(src, markers);
// 结果中的-1表示轮廓

方法3: 机器学习或深度学习方法

对于特别复杂的无规则背景图像,可以使用机器学习或深度学习方法(如SVM, CNN)进行训练和检测。

// 示例代码:使用预训练的深度学习模型进行缺陷检测
Net net = readNet("model_path");
Mat blob = blobFromImage(src, 1.0, Size(224, 224), Scalar(104, 117, 123));
net.setInput(blob);
Mat prob = net.forward();

通过针对不同背景类型采用相应的方法,可以提高缺陷检测的准确性和效率。

 


总结

    缺陷检测在工业制造和质量控制等领域中至关重要。根据图像背景的复杂程度和特征差异,缺陷检测方法通常分为三类:单调背景、规则纹理背景和无规则图像背景。在单调背景下,阈值分割和差分法能够有效地识别明显的缺陷区域。对于规则纹理背景,模板匹配和Gabor滤波器可以精确检测纹理中的异常变化。此外,傅里叶变换作为一种频域分析工具,能够识别周期性纹理中的缺陷,尤其适用于规则纹理背景下的缺陷检测。在无规则图像背景中,边缘检测、图像分割(如Watershed算法)以及深度学习方法适合用于处理复杂的缺陷模式。通过灵活应用这些方法,结合傅里叶变换对频率信息的分析,可以进一步提高缺陷检测的精度和效率,从而满足多样化的实际需求。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP 全攻略:从环境搭建到实战项目的深度探索

一、引言 PHP&#xff08;Hypertext Preprocessor&#xff09;是一种广泛应用于 Web 开发的服务器端脚本语言。它具有简单易学、功能强大、开源免费等特点&#xff0c;被众多开发者和企业所青睐。本文将详细介绍 PHP 的开发环境搭建、基本语法格式、变量与变量作用域、常量与数…

将Keil工程文件移植到VScode+Platformio环境下

1创建工作空间 1.1创建PIO工程 若弹出报错不用管他&#xff08;装加密软件的电脑会报错并少创建几个文件&#xff09;。PIO会在我们选定的文件夹下创建名为Name&#xff08;Project&#xff09;的文件夹 打demo/Project文件夹可以看到生成一堆文件 1.2创建CubeMX工程 网上很多…

【推荐】领导说Java线程池都用不好,明天不要来了?

引言 工作中难免会遇到各种并发场景&#xff0c;笔者先后经历的公司中&#xff0c;很多同事或多或少都用到过Java线程池来实现并发处理。 但线程池用的好的&#xff0c;却没几个。笔者也曾排查过线上问题&#xff0c;有几次&#xff0c;都是因为线程泄漏&#xff0c;导致出现…

无主灯设计:点亮空间美学的现代之选

在这个追求个性化与舒适度并重的时代&#xff0c;家居照明已不再是简单的照明需求&#xff0c;它逐渐演变为营造空间氛围、彰显居住者品味的重要元素。无主灯设计&#xff0c;作为现代照明设计的一种流行趋势&#xff0c;以其灵活多变、层次丰富、光线柔和的特点&#xff0c;赢…

《黑神话:悟空》中的AI技术运用

2024年8 月 20 日&#xff0c;《黑神话&#xff1a;悟空》全球同步上线&#xff0c;作为首个国产 3A 游戏&#xff0c; 1. A lot of money&#xff1a;大量资金 2. A lot of resources&#xff1a;大量资源 3. A lot of time&#xff1a;大量时间 一、悟空中的AI技术 《‌黑…

oracle exadata x8-2 crs有报错PRVG-12885

PRVG-12885 处理办法&#xff1a; Output from # dcli -l root -g dbs_group ip addr list | grep ib shows that all MTU sizes are 65520 Output from # ifconfig -a shows that the MTU size for the loopback interface was 16436 临时办法&#xff1a; Set the mtu…

vue-admin-template pan版使用方法

新建文件夹&#xff0c;创建后端子文件夹&#xff0c;使用命令行创建django后端&#xff1a;django-admin startproject 后端名称 首先下载vue-admin-template-master文件&#xff0c;将其复制进项目的前端文件夹&#xff0c;在命令行中切换到前端目录&#xff0c;执行npm ins…

特征工程-数据处理

一、读取数据 import pandas as pd import numpy as npdf pd.read_csv(E:/workspace/dataset/WA_Fn-UseC_-Telco-Customer-Churn.csv) df.head()字段解释&#xff1a; 二、数据质量探索 1、去重分析 df1 df.copy()# 判断是否存在重复 df1[customerID].nunique() df1.shape[…

性能飞跃!18种大模型指令调优技巧大放送,打造更强LLM!

指令调优&#xff08;IT&#xff09;&#xff0c;一种针对大型语言模型&#xff08;LLMs&#xff09;的训练方法&#xff0c;是提高大型语言模型能力和可控性的关键技术。该方法的核心目标是使LLM具备遵循自然语言指令并完成现实世界任务的能力。它弥补了LLM的下一个单词预测目…

[Meachines] [Easy] BoardLight Dolibarr17.0.0-RCE+Enlightenment v0.25.3权限提升

信息收集 IP AddressOpening Ports10.10.11.11TCP:22,80 $ nmap -p- 10.10.11.11 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 06:2…

【软件使用-MEGA】报错及解决方法

报错1&#xff1a;Error: MEGA has detected duplicate taxa labels. (in line 370) **************************************************************************** ; Please note the following important messages: ; **********************************…

怎么写文献综述?文献综述方法和工具推荐!

文献综述是每个科研人绕不过的坎&#xff0c;其实文献综述简单说就是对你自己研究主题之前的研究的一个完整的概括&#xff0c;这个完整的概括主要是来展示目前已有的一些观点和未来可能可以在这个主题之下能够研究的一些创新点&#xff0c;用很多文献来支撑你自己的研究主题。…

Java11 文件操作和io流

文件操作和IO流 文件操作和IO流磁盘操作File类创建file对象文件操作获取文件信息判断文件删除文件创建文件 Files工具类字符操作字节操作遍历目录&#xff08;非递归&#xff09; IO流字节操作&#xff08;字节流&#xff09;输出流&#xff1a;InputStream&#xff08;读&…

C++学习笔记——菲波那契数

一、题目描述 二、代码 #include <iostream> using namespace std;int main() {int k0;cin >> k;int a[k];a[0]1;a[1]1;for(int i2;i<k;i){a[i] a[i-1] a[i-2] ;}cout << a[k-1];return 0; }

VBA技术资料MF193:获取右键菜单的名称及ID

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

合宙Air700EAQ硬件设计手册——射频接口、电气特与规格

合宙Air700EAQ是一款基于移芯EC716E平台设计的LTE Cat 1无线通信模组。 支持亚洲FDD-LTE的4G远距离无线传 输技术。 以极小封装&#xff0c;极高性价比&#xff0c;满足IoT行业的数传应用需求。 例如共享应用场景&#xff0c;定位器场景&#xff0c;DTU数 传场景等。 本文我…

中仕公考怎么样?考公怎么看我的专业能不能报?

正在国考备考的考生们注意看了&#xff0c;怎么看自己的专业是否能报?中仕为大家讲解一下! 在公务员考试中&#xff0c;不同的专业可选择的岗位不同&#xff0c;根据岗位的多少又分为&#xff1a;热门专业和冷门专业&#xff0c;那些专业是热门专业? 考公热门专业&#xff…

Java 工厂模式的使用,零基础教程,上手即会

工厂模式&#xff08;Factory Pattern&#xff09;是一种常用的创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。&#xff08;常用…

splunk Enterprise 的HTTP收集器-windows

1.创建HTTP收集器 2.使用HTTP收集器 然后打开全局设置&#xff1a;把ssl给去掉&#xff0c;点保存&#xff08;保存之后&#xff0c;可以看到这些状态全部都是已启用了&#xff09;&#xff1a; 3.测试&#xff1a; curl --location --request POST http://192.168.11.131:808…

为什么已经设置了.gitignore文件,但某些需要被忽略的文件仍然显示?如何解决.gitignore无法忽略文件?

问题描述&#xff1a; 某个同事&#xff0c;不小心把编译文件夹&#xff08;这两个文件夹【uni_modules 和unpackage】&#xff09;提交到了远程仓库里。导致其他人提交的时候提示了冲突。因为每个人编译出来的文件都不一样。 然后我们在.gitignore文件设置了排除这两个文件夹…