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.mfbz.cn/a/761998.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制造型企业生产管理的技巧,你都用过哪些?

作为管理者&#xff0c;一谈到生产管理&#xff0c;你可能会想到很多生产过程中的问题&#xff1a;订单准交率不高、计划达成率不高、生产效率低、再制品太多、生产周期长等等一系列问题&#xff1b;如果你不仅仅是一名管理者&#xff0c;你还是一名企业主&#xff0c;你甚至经…

安装Rabbitmq遇到的坑

&#xff01;&#xff01;&#xff01;一定要对号版本号 不同的虚拟机unbontu、cetenos和不同的erlang和不同的rabbitmq之间要对应下载对应版本 下面给出我的版本centos7erlangrabbitmq 分割线 安装好后&#xff0c;如果在虚拟机的服务器上可以打开&#xff0c;在本地浏览器…

UI(四)布局

文章目录 10、Navigator——路由器组件11、Pannel——可滑动面板12、Refresh——刷新组件13、RelativeContainer——相对布局组件14、Scroll——可滚动容器15、SideBarContainer——侧边栏容器16、Stack——堆叠容器17、Swiper——滑动块视图容器18、Tabs和TabContent——页签和…

Nginx-2

一、高级配置 1.1网页状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状…

【SQL】已解决:SQL错误(208):对象名‘STRING_SPLIT‘无效

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SQL错误&#xff08;208&#xff09;&#xff1a;对象名‘STRING_SPLIT‘无效 在使用SQL Server进行数据库操作时&#xff0c;遇到错误&#xff08;208&#xff…

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

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

SpringBoot项目中获取IP地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 OkHttp 是一个由 Square 开发的高效、现代的 HTTP 客户端库&#xff0c;用于 Android 和 Java 应用程序。它支持 HTTP/2 和 SPDY 等现代网络协议&#xff0c;…

详解COB显示屏的技术特点

COB&#xff08;Chip on Board&#xff09;显示屏作为一种采用倒装COB封装技术的LED显示屏&#xff0c;在显示效果以及使用稳定性跟防护性方面&#xff0c;拥有更大优势&#xff0c;今天跟随COB显示屏厂家中品瑞科技一起来看看&#xff0c;COB显示屏的技术特点&#xff1a; 1、…

【前端vue3】TypeScrip-类型推论和类型别名

类型推论 TypeScript里&#xff0c;在有些没有明确指出类型的地方&#xff0c;类型推论会帮助提供类型。 例如&#xff1a; 变量xiaoc被推断类型为string 如重新给xiaoc赋值数字会报错 let xiaoc "xiaoc"xiaoc 1111111111111如没有给变量指定类型和赋值&#xf…

tcpdump命令详解及使用实例

1、抓所有网卡数据包&#xff0c;保存到指定路径 tcpdump -i any -w /oemdata/123.pcap&一、tcpdump简介 tcpdump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤&#xff0c;并提供and、or、not等逻辑语句来去掉无用的信…

内网服务器时间校正

新购买的云服务器发现内网机器和可以访问外网的机器时间慢了三分钟&#xff0c;导致有些访问会报错&#xff0c;那么我们配置一下ntp校正一下时间。外网配置起来比较简单&#xff0c;直接下载ntp执行校正命令即可。 比当前时间慢了三分钟 注意当前服务器是可以访问外网的机器这…

道可云AI智能体平台全新升级,加快培育发展新质生产力

数字化时代浪潮下&#xff0c;以人工智能为代表的新一代信息技术正在加速推动社会变革&#xff0c;给各行各业带来巨大发展机遇。在AI技术的加持下&#xff0c;“人工智能”成为时代发展趋势&#xff0c;也是加快培育和发展新质生产力的新动能。 为培育数字经济发展新动能&…

自定义vue3 hooks

文章目录 hooks目录结构demo hooks 当页面内有很多的功能&#xff0c;js代码太多&#xff0c;不好维护&#xff0c;可以每个功能都有写一个js或者ts&#xff0c;这样的话&#xff0c;代码易读&#xff0c;并且容易维护&#xff0c;组合式setup写法与此结合&#x1f44d;&#…

Java基础(判断和循环)

一、流程控制语句-顺序结构 顺序结构语句是Java程序默认的执行流程&#xff0c;按照代码的先后顺序&#xff0c;从上到下依次执行。 二、流程控制语句-分支结构&#xff08;分支结构包括if、switch) if语句&#xff1a;在程序中用来进行判断 1、If语句的第一种格式&#xf…

HTTP请求响应/与HTTPS区别

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;和HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是用于在计算机网络上传输信息的两种协议。 HTTP&#xff08;Hypertext Transfer Protocol&#xff09;: HTTP 是一种用于传输超文本的应用层协议…

谈谈创意设计中的AI、AGI、AIGC

在当今的数字化时代&#xff0c;创意设计领域正经历着前所未有的变革。随着人工智能&#xff08;AI&#xff09;、通用人工智能&#xff08;AGI&#xff09;以及人工智能生成内容&#xff08;AIGC&#xff09;的迅猛发展&#xff0c;设计师们的工作方式和创作手段都发生了深刻的…

网络基础-RIP协议

RIP&#xff08;Routing Information Protocol&#xff09;是一个基于距离矢量的动态路由协议&#xff0c;常用于小型到中型网络。RIP是较早的路由协议之一&#xff0c;具有简单易用的特点。以下是关于RIP协议的详细介绍&#xff1a; RIP的主要特点 ①使用跳数&#xff08;ho…

Flutter循序渐进==>数据结构(列表、映射和集合)和错误处理

导言 填鸭似的教育确实不行&#xff0c;我高中时学过集合&#xff0c;不知道有什么用&#xff0c;毫无兴趣&#xff0c;等到我学了一门编程语言后&#xff0c;才发现集合真的很有用&#xff1b;可以去重&#xff0c;可以看你有我没有的&#xff0c;可以看我有你没有的&#xf…

SAP 替代关系完全替代简介

最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。 关于替代料的逻辑在前面的博文中测试多个替代料的使用场景 1、后继物料 2、组合替代 本文主要测试一下…

【密码学基础】对随机不经意传输(Random Oblivious Transfer)的理解

ROT在offline阶段生成大量的OT对&#xff0c;在online阶段通过one-pad方式高效加密&#xff0c;并且只需要简单的异或运算就能实现OT过程&#xff08;去随机化&#xff09;。 在ROT中&#xff0c;有一个关键点是&#xff1a;需要考虑offline阶段的选择比特和online阶段的选择比…
最新文章