当前位置: 首页 > news >正文

C++视觉开发 三.缺陷检测

一.距离变换

1.概念和功能

距离变换是一种图像处理技术,用于计算图像中每个像素到最近的零像素(背景像素)的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素(背景像素)的距离。这个距离可以是欧氏距离、曼哈顿距离等。距离变换后的图像中,前景像素的值代表它们到最近的背景像素的距离。

具体来说,距离变换在缺陷检测中有以下几个重要作用:

1.前景与背景的分离: 距离变换能够突出前景区域,使其与背景更明显地分离开。前景区域的像素值会表示其到最近背景像素的距离,这样可以更容易地识别和处理前景对象。

2.前景对象的中心检测: 距离变换的结果图像中,距离值最大的像素往往位于前景对象的中心位置。因此,通过距离变换,可以有效地检测出前景对象的中心点,为后续的形态学处理和轮廓检测提供可靠的信息。

3.分水岭算法的预处理: 距离变换常用于分水岭算法的预处理步骤,通过距离变换可以生成标记图像,这些标记可以帮助分水岭算法准确地分割图像中的各个对象。

4.形态学重建: 距离变换可以结合形态学操作进行形态学重建,用于去除图像中的小噪声和伪影,使前景对象更加清晰。

2.函数语法

示例:

// 距离变换
cv::Mat dist_transform;
cv::distanceTransform(op, dist_transform, cv::DIST_L2, 3);
cv::normalize(dist_transform, dist_transform, 0, 1.0, cv::NORM_MINMAX);// 阈值处理
cv::Mat fore;
cv::threshold(dist_transform, fore, 0.3, 1.0, cv::THRESH_BINARY);
fore.convertTo(fore, CV_8U);

1. cv::distanceTransform 

功能:用于计算二值图像中每个前景像素到最近背景像素的距离。

函数语法:

void cv::distanceTransform(InputArray src, OutputArray dst, int distanceType, int maskSize, int dstType = CV_32F);

参数含义
src

输入图像,通常是一个二值图像。

其中非零像素被视为前景,零像素被视为背景。

dst

输出图像,包含每个像素到最近背景像素的距离。

默认情况下,输出图像是一个32位浮点图像(CV_32F)。

distanceType

距离类型,指定距离的计算方式。常用的类型有:

cv::DIST_L1:曼哈顿距离(每个像素的邻居为上下左右四个方向)。

cv::DIST_L2:欧氏距离(每个像素的邻居为周围八个方向)。

cv::DIST_C:棋盘距离(类似于曼哈顿距离,但允许对角线方向移动)

maskSize掩码大小,影响距离计算的精度。可以是3、5或cv::DIST_MASK_PRECISE(在精确距离变换中使用)。常用值为3。
dstType

输出图像的类型。默认值为CV_32F,表示32位浮点图像。

可以更改为其他类型,如CV_8U(8位无符号整数)等。

2.cv::normalize 

功能:用于将数组的值归一化到指定的范围内。它可以应用于图像处理中的多种场景,例如将距离变换的结果归一化到 [0, 1] 或 [0, 255],从而便于可视化和后续处理。

函数语法:

void cv::normalize(
InputArray src, 
OutputArray dst, 
double alpha, 
double beta, 
int norm_type = cv::NORM_L2, 
int dtype = -1, 
InputArray mask = noArray()
);
参数含义
src输入数组或图像
dst输出数组或图像,与输入数组具有相同的大小和类型,或者具有指定的类型。
alpha

归一化后数组中最小值的目标值。

如果 norm_type 是 cv::NORM_MINMAX,这个参数表示归一化后的最小值。

beta

归一化后数组中最大值的目标值。

如果 norm_type 是 cv::NORM_MINMAX,这个参数表示归一化后的最大值。

norm_type

归一化类型。可以是以下之一:

cv::NORM_INF:归一化为无穷范数(最大绝对值)。

cv::NORM_L1:归一化为 L1 范数(绝对值之和)。

cv::NORM_L2:归一化为 L2 范数(平方和的平方根)。

cv::NORM_MINMAX:线性变换,将数组值线性缩放到 [alpha, beta] 范围。

dtype(可选)输出数组的类型。如果为 -1,则输出数组的类型与输入数组相同。
mask (可选)可选的操作掩码。仅对掩码内的元素进行归一化处理。

           只用前5个就够了

3.fore.convertTo

功能:将矩阵转换为另一种数据类型的函数。此函数通常用于图像处理中的数据类型转换,以确保图像处理操作使用正确的数据类型。

函数语法:

void cv::Mat::convertTo(OutputArray m, int rtype, double alpha , double beta)
参数含义
m输出矩阵,类型由 rtype 指定。
rtype输出矩阵的类型。可以是 CV_8U(8 位无符号整数)、CV_32F(32 位浮点数)等。
alpha可选的比例因子,默认值为 1。输出矩阵的每个元素是输入矩阵相应元素乘以 alpha
beta 可选的加数,默认值为 0。输出矩阵的每个元素是输入矩阵相应元素乘以 alpha 再加上 beta

二.缺陷检测

通过计算轮廓面积和最小外接圆的面积比值来判断是否存在缺陷

1.cv::minEnclosingCircle 最小外接圆

功能:找到一个最小的圆,使得圆能够完全包围给定的轮廓。

函数语法:

void cv::minEnclosingCircle(InputArray points, Point2f& center, float& radius);
参数含义
points输入的点集,可以可以是一个点的向量或Mat。
center输出参数,存储最小外接圆的圆心坐标。
radius输出参数,存储最小外接圆的半径。

2.完整代码示例

#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 读取图像cv::Mat o = cv::imread("pill3.jpg", cv::IMREAD_GRAYSCALE);if (o.empty()) {std::cerr << "Could not open or find the image!" << std::endl;return -1;}// 二值化处理cv::Mat binary;cv::threshold(o, binary, 0, 255, cv::THRESH_BINARY + cv::THRESH_OTSU);// 形态学开运算cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));cv::Mat op;cv::morphologyEx(binary, op, cv::MORPH_OPEN, kernel, cv::Point(-1, -1), 1);// 距离变换cv::Mat dist_transform;cv::distanceTransform(op, dist_transform, cv::DIST_L2, 3);cv::normalize(dist_transform, dist_transform, 0, 1.0, cv::NORM_MINMAX);// 阈值处理cv::Mat fore;cv::threshold(dist_transform, fore, 0.3, 1.0, cv::THRESH_BINARY);fore.convertTo(fore, CV_8U);// 形态学去噪cv::Mat kernel2 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));cv::Mat op2;cv::morphologyEx(fore, op2, cv::MORPH_OPEN, kernel2, cv::Point(-1, -1), 1);// 提取轮廓std::vector<std::vector<cv::Point>> contours;cv::findContours(op2, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);// 缺陷检测int count = 0;cv::Mat img = o.clone();for (size_t i = 0; i < contours.size(); i++) {cv::Point2f center;float radius;cv::minEnclosingCircle(contours[i], center, radius);double area = cv::contourArea(contours[i]);double area_circle = 3.14 * radius * radius;if (area / area_circle >= 0.5) {cv::putText(img, "OK", center, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255), 2);}else {cv::putText(img, "bad", center, cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255), 2);}count++;}cv::putText(img, "sum=" + std::to_string(count), cv::Point(20, 30), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 255, 255));// 显示结果cv::imshow("result", img);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

结果如图:

相关文章:

C++视觉开发 三.缺陷检测

一.距离变换 1.概念和功能 距离变换是一种图像处理技术&#xff0c;用于计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距离。它常用于图像分割、形态学操作和形状分析等领域。它计算图像中每个像素到最近的零像素&#xff08;背景像素&#xff09;的距…...

使用 Amazon Bedrock Converse API 简化大语言模型交互

本文将介绍如何使用 Amazon Bedrock 最新推出的 Converse API&#xff0c;来简化与各种大型语言模型的交互。该 API 提供了一致的接口&#xff0c;可以无缝调用各种大型模型&#xff0c;从而消除了需要自己编写复杂辅助功能函数的重复性工作。文中示例将展示它相比于以前针对每…...

第二十一章 函数(Python)

文章目录 前言一、定义函数二、函数参数三、参数类型四、函数返回值五、函数类型1、无参数&#xff0c;无返回值2、无参数&#xff0c;有返回值3、有参数&#xff0c;无返回值4、有参数&#xff0c;有返回值 六、函数的嵌套七、全局变量和局部变量1、局部变量2、全局变量 前言 …...

使用pyqt5编写一个七彩时钟

使用pyqt5编写一个七彩时钟 效果代码解析定义 RainbowClockWindow 类初始化用户界面显示时间方法 完整代码 在这篇博客中&#xff0c;我们将使用 PyQt5 创建一个简单的七彩数字时钟。 效果 代码解析 定义 RainbowClockWindow 类 class RainbowClockWindow(QMainWindow):def _…...

【Linux】:命令行参数

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux命令行参数的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…...

高考假期预习指南,送给迷茫的你

高考结束&#xff0c;离别了熟悉的地方&#xff0c;踏上远方。 你&#xff0c;&#xff0c;迷茫吗&#xff1f; 大学是什么&#xff1f;到了大学我该怎样学习&#xff1f;真像网上说的毕业即失业吗&#xff1f; 大学是一个让你学会一技之长的地方&#xff0c;到了大学找到自…...

独孤思维:负债了,还可以翻身吗

01 其实独孤早年也负债。 负债并不可怕。 可怕的是因为负债而催生的想要快速赚钱的心态。 越是有这种心态&#xff0c;越是不可能赚到钱。 相反&#xff0c;可能会让你陷入恶性循环中。 盲目付费&#xff0c;盲目寄希望于某个项目或者某个人。 当成唯一的救命稻草。 这…...

SwiftUI八与UIKIT交互

代码下载 SwiftUI可以在苹果全平台上无缝兼容现有的UI框架。例如&#xff0c;可以在SwiftUI视图中嵌入UIKit视图或UIKit视图控制器&#xff0c;反过来在UIKit视图或UIKit视图控制器中也可以嵌入SwiftUI视图。 本文展示如何把landmark应用的主页混合使用UIPageViewController和…...

RedHat9 | 内部YUM本地源服务器搭建

服务器参数 标识公司内部YUM服务器主机名yum-server网络信息192.168.37.1/24网络属性静态地址主要操作用户root 一、基础环境信息配置 修改主机名 [rootyum-server ~]# hostnamectl hostname yum-server添加网络信息 [rootyum-server ~]# nmcli connection modify ens160 …...

无偏归一化自适应心电ECG信号降噪方法(MATLAB)

心电信号作为一种生物信号&#xff0c;含有大量的临床应用价值的信息&#xff0c;在现代生命医学研究中占有重要的地位。但心电信号低频、低幅值的特点&#xff0c;使其在采集和传输的过程中经常受到噪声的干扰&#xff0c;使心电波形严重失真&#xff0c;从而影响后续的病情分…...

AI基本概念(人工智能、机器学习、深度学习)

人工智能 、 机器学习、 深度学习的概念和关系 人工智能 &#xff08;Artificial Intelligence&#xff09;AI- 机器展现出人类智慧机器学习 &#xff08;Machine Learning) ML, 达到人工智能的方法深度学习 &#xff08;Deep Learning&#xff09;DL,执行机器学习的技术 从范围…...

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…...

校园卡手机卡怎么注销?

校园手机卡的注销流程可以根据不同的运营商和具体情况有所不同&#xff0c;但一般来说&#xff0c;以下是注销校园手机卡的几种常见方式&#xff0c;我将以分点的方式详细解释&#xff1a; 一、线上注销&#xff08;通过手机APP或官方网站&#xff09; 下载并打开对应运营商的…...

logback自定义规则脱敏

自定义规则conversionRule public class LogabckMessageConverter extends MessageConverter {Overridepublic String convert(ILoggingEvent event) {String msg event.getMessage();if ("INFO".equals(event.getLevel().toString())) {msg .....脱敏实现}return …...

高效批量复制与覆盖:一键实现文件管理,轻松应对同名文件,简化工作流程

在数字时代&#xff0c;我们每天都在与海量的文件和数据打交道。你是否曾经遇到过这样的情况&#xff1a;需要批量复制文件到指定文件夹&#xff0c;但一遇到同名文件就头疼不已&#xff0c;要么手动一个个确认覆盖&#xff0c;要么冒着数据丢失的风险直接操作&#xff1f;别担…...

vue3中使用Antv G6渲染树形结构并支持节点增删改

写在前面 在一些管理系统中&#xff0c;会对组织架构、级联数据等做一些管理&#xff0c;你会怎么实现呢&#xff1f;在经过调研很多插件之后决定使用 Antv G6 实现&#xff0c;文档也比较清晰&#xff0c;看看怎么实现吧&#xff0c;先来看看效果图。点击在线体验 实现的功能…...

【PB案例学习笔记】-26制作一个带浮动图标的工具栏

写在前面 这是PB案例学习笔记系列文章的第26篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…...

反向沙箱技术:安全隔离上网

在信息化建设不断深化的今天&#xff0c;业务系统的安全性和稳定性成为各公司和相关部门关注的焦点。面对日益复杂的网络威胁&#xff0c;传统的安全防护手段已难以满足需求。深信达反向沙箱技术&#xff0c;以其独特的设计和强大的功能&#xff0c;成为保障政务系统信息安全的…...

前端在for循环中使用Element-plus el-select中的@click.native动态传参

<el-table ref"table" :data"editTableVariables" cell-dblclick"handleRowDblClick" style"width: 100%" > <!-- el-table-column: 表格列组件&#xff0c;定义每列的展示内容和属性 --><el-table-column prop&q…...

Oracle SQL - CONNECT BY语句Where条件中不能使用OR?[已解决]

数据 SQL> SELECT * FROM demo_a;CUSTOMER TOTAL ---------- ---------- A 100200SQL> SELECT * FROM demo_b;CUSTOMER RN QTY ---------- ---------- ---------- A 1 30 A 2 …...

纯本地运行!AgentCPM深度研报助手,手把手教你离线生成研究报告

纯本地运行&#xff01;AgentCPM深度研报助手&#xff0c;手把手教你离线生成研究报告 1. 为什么选择本地研报生成工具&#xff1f; 在信息爆炸的时代&#xff0c;专业研究报告的撰写面临三大痛点&#xff1a; 时间压力&#xff1a;从零开始撰写一份深度报告平均需要40-60小…...

LaTeX表格排版救星:用tabularx和 esizebox搞定超宽表格(Overleaf实测)

LaTeX表格排版救星&#xff1a;用tabularx和resizebox搞定超宽表格&#xff08;Overleaf实测&#xff09; 在学术写作中&#xff0c;数据表格是展示研究成果的重要方式&#xff0c;但处理多列宽表时常常让人头疼——要么表格溢出页面边界&#xff0c;要么缩放后字体小到难以辨认…...

UNIT-00:Berserk Interface辅助数据库课程设计:从ER图到SQL

UNIT-00&#xff1a;Berserk Interface辅助数据库课程设计&#xff1a;从ER图到SQL 你是不是正在为数据库课程设计发愁&#xff1f;面对一个模糊的业务需求&#xff0c;要从零开始画出清晰的ER图&#xff0c;再设计出规范化的数据库模式&#xff0c;最后还要写出一堆建表和查询…...

IndexTTS 2.0情感控制效果:用自然语言描述生成对应语气语音

IndexTTS 2.0情感控制效果&#xff1a;用自然语言描述生成对应语气语音 1. 引言&#xff1a;语音合成的革命性突破 想象一下这样的场景&#xff1a;你正在制作一部动画短片&#xff0c;主角需要说一句"我受够了&#xff01;"——但你不只是想让它"说出来"…...

从XJTUSE编译原理小测出发:手把手教你用Python实现一个简易的词法分析器

从理论到实践&#xff1a;用Python构建词法分析器的完整指南 编译原理常被视为计算机科学中的"玄学"——课堂上听得云里雾里&#xff0c;考试时全靠死记硬背。但当我第一次用Python实现了一个能识别简单算术表达式的词法分析器后&#xff0c;那些抽象的状态转换图、有…...

计算机毕设 java 基于 Javaweb 的家教管理系统 智能家教匹配管理系统 家教服务综合平台

计算机毕设 java 基于 Javaweb 的家教管理系统 f7xm39&#xff08;配套有源码 程序 mysql 数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联 xi 可分享随着家庭教育需求的不断增长&#xff0c;家教市场规模持续扩大&#xff0c;但传统家教模式…...

挖漏洞一个月能赚多少钱?挖漏洞入门到精通教程,收藏这一篇就够了

学会网安技术后去挖漏洞一个月能搞多少外快&#xff1f; 现在很多白帽子都是白天上班晚上挖洞&#xff0c;甚至有的人连班都不想上&#xff0c;纯靠挖漏洞来收入&#xff0c;比如说补天上面的这些人&#xff0c;每个月收入较高的都是他们&#xff0c;八成都是在家全职挖洞了。…...

单细胞测序数据读取实战指南:从CellRanger到Seurat对象

1. 单细胞测序数据读取入门指南 第一次接触单细胞测序数据分析时&#xff0c;最让人头疼的就是数据读取环节。记得我刚入门那会儿&#xff0c;光是理解CellRanger输出的各种文件格式就花了整整一周时间。不过别担心&#xff0c;今天我就把这块硬骨头啃碎了讲给你听。 单细胞测序…...

基于Session管理的在线视频学习平台防作弊策略

1. Session管理在在线学习平台中的核心作用 在线视频学习平台最头疼的问题之一&#xff0c;就是如何防止用户通过多设备同时登录来刷学习进度。想象一下&#xff0c;如果用户同时在手机、平板和电脑上登录同一个账号&#xff0c;三倍速刷完课程&#xff0c;这对其他认真学习的用…...

从PaddlePaddle 2.2.2平滑升级到2.4.2的实战指南

1. 升级前的准备工作 在开始升级PaddlePaddle之前&#xff0c;我们需要做好充分的准备工作。首先检查当前环境&#xff0c;确保系统满足升级要求。我建议创建一个新的Python虚拟环境来隔离升级过程&#xff0c;这样可以避免影响其他项目。使用conda创建环境的命令如下&#xff…...