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;
}

结果如图:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop权威指南-读书笔记-01-初识Hadoop

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 第一章—初识Hadoop Tips&#xff1a; 这个引例很有哲理嘻嘻&#x1f604;&#xff0c;道出了分布式的灵魂。 1.1 数据&#xff01;数据&#xff01; 这一小节主要介绍了进入大数据时代&#xff0c;面…

喜讯|华院计算认知智能引擎算法平台荣登BPAA大赛创新组TOP50

6月25日&#xff0c;备受瞩目的BPAA第四届全球应用算法模型典范大赛&#xff08;以下简称“BPAA大赛”&#xff09;正式揭晓了《第四届全球应用算法模型典范大赛创业组TOP50榜单》和《第四届全球应用算法模型典范大赛创新组TOP50榜单》。其中&#xff0c;华院计算技术&#xff…

SpringBoot中整合ONLYOFFICE在线编辑

SpringBoot整合OnlyOffice SpringBoot整合OnlyOffice实现在线编辑1. 搭建私有的OnlyOffice的服务2. SpringBoot进行交互2.1 环境2.2 我们的流程2.3 接口规划2.3.1 获取编辑器配置的接口2.3.2 文件下载地址2.3.3 文件下载地址 3. 总结4. 注意4.1 你的项目的地址一定一定要和only…

HttpServletResponse设置headers返回,发现headers中缺少“Content-Length“和“Content-Type“两个参数。

业务中需要将用httpUtils请求返回的headers全部返回&#xff0c;塞到HttpServletResponse中&#xff0c;代码如下&#xff1a; HttpServletResponse response;// 返回headers Arrays.stream(httpResponse.getHeaders()).forEach(header -> response.setHeader(header.getNa…

Kimi 上下文缓存功能开启公测!降低使用费用,加快模型相应速度

7月2日&#xff0c;系统之家发布消息&#xff0c;月之暗面科技有限公司旗下的Kimi开放平台正式推出上下文缓存功能&#xff0c;并已开放公测。这项功能专为处理频繁请求和大量重复引用初始上下文的场景设计&#xff0c;能有效降低使用长文本模型的成本&#xff0c;并显著提升处…

React小记(五)_Hooks入门到进阶

React 16.8 版本 类组件 和 函数组件 两种组件共存&#xff0c;到目前 React 18 版本&#xff0c;官方已经不在推荐使用类组件&#xff0c;在函数组件中 hooks 是必不可少的&#xff0c;它允许我们函数组件像类组件一样可以使用组件的状态&#xff0c;并模拟组件的生命周期等一…

ChatGPT-4o医学应用、论文撰写、数据分析与可视化、机器学习建模、病例自动化处理、病情分析与诊断支持

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届开发者大会被称为“科技界的春晚”&#xff0c;吸引了全球广大…

Cesium大屏-vue3注册全局组件

1.需求 说明&#xff1a;产品经理要求开发人员在地图大屏上面随意放置组件&#xff0c;并且需要通过数据库更改其组件大小&#xff0c;位置等&#xff1b;适用于大屏组件中场站视角、任意位置标题等。 2.实现 2.1GlobalComponents.vue 说明&#xff1a;containerList可以通…

力扣热100 哈希

哈希 1. 两数之和49.字母异位词分组128.最长连续序列 1. 两数之和 题目&#xff1a;给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。…

蜜雪冰城小程序逆向

app和小程序算法一样 小程序是wasm

SpringMVC的视图

文章目录 1、ThymeleafView2、转发视图3、重定向视图4、视图控制器view-controller SpringMVC 中的视图是 View 接口&#xff0c;视图的作用渲染数据&#xff0c;将模型 Model 中的数据展示给用户SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图当工程引入jstl…

楼层分户项目分析

文章目录 1. 区域绘制2. 户型切分3. 楼房分层4. 编辑房户信息5. 查看房户信息6. 数据库6.1. 楼栋数据库6.2. 单位数据库 7. 房户数据库 1. 区域绘制 点击绘制图形&#xff0c;激活画笔&#xff0c;右键结束绘制。 输入框可以更换地址前缀。 分户坐标是由绘制的多个点组成的&…

在宿主机上个修改虚拟机的用户密

1、远程修改虚拟机密码 1.1在虚拟机上安装Qemu Guest Agent yum -y install qemu-guest-agent --enablerepoC7.4* systemctl enable qemu-guest-agent systemctl start qemu-guest-agent vim /etc/sysconfig/qemu-ga #注释此行 systemctl restart qemu-guest-agent.servic…

LabVIEW电压电流实时监测系统

开发了一种基于LabVIEW和研华&#xff08;Advantech&#xff09;数据采集卡的电压电流实时监测系统&#xff0c;通过高效的数据采集和处理&#xff0c;为工业和科研用户提供高精度、实时的电压电流监测解决方案。系统采用研华USB-4711A数据采集卡&#xff0c;结合LabVIEW编程环…

SAP 接口-银行账号主数据维护接口【MDM->SAP】开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

接口映射字段 开发通用说明 根据MDM传输字段调用BAPI生成银行账号及开户行。 开户行维护BAPI【BAPI_BANK_CREATE】 银行账号维护BAPI【BAPI_FCLM_BAM_AMD_BNKANT】 接口字段【ZZZH 主账户标识】=1时字段【DTAAI】DME标识赋值:常用; 接口字段【ZZZH 主账户标识】=0时字段…

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b; 同时这种”透明遍历“也…

Optional类方法

Optional类 简介方法empty()方法of(T value)ofNullable(T value)filter(Predicate<? super T> predicate)get()ifPresent(Consumer<? super T> consumer)isPresent()map(Function<? super T,? extends U> mapper)orElse(T other)orElseGet(Supplier<?…

Linux运维:mysql高级查询语句(2)

目 录 一、创建数据库&#xff1a; 二、创建表结构&#xff1a;DDL 2.1 学生表s&#xff1a; 2.2 成绩表sc&#xff1a; 2.3 课程表c&#xff1a; 三、录入数据&#xff1a;DML 3.1 对学生表s的数据录入&#xff1a; 3.2 对成绩表sc的数据录入&#xff1a; 3.3 对课…

【MySQL】数据库——备份与恢复,日志管理1

一、数据备份的重要性 1.备份的主要目的是灾难恢复 在生产环境中&#xff0c;数据的安全性至关重要 任何数据的丢失都可能产生严重的后果造成数据丢失的原因&#xff1a; 程序错误人为,操作错误运算错误磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃 2.数据库备份…

【云原生】服务网格(Istio)如何简化微服务通信

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、微服务架构的兴起 2、Istio&#xff1a;服务网格的佼…