DrGraph原理示教 - OpenCV 4 功能 - 二值化

二值化,也就是处理结果为0或1,当然是针对图像的各像素而言的
1或0,对应于有无,也就是留下有用的,删除无用的,有用的部分,就是关心的部分
在图像处理中,也不仅仅只是1或0,因为这两个值看起来都是黑的,人眼很难分辨清楚,那就放大一些,255或0,黑白就出来了
目标识别、图像分割、目标提取等后续应用,很多会基于二值化的结果。所以图像分析的二值化处理是一个重要环节。比如CSDN的OpenCV技能树:
在这里插入图片描述

广义来说,分析或处理的结果中,各像素点只在0/255间取值,那就算是二值化,所以阈值、腐蚀与膨胀、开运算与闭运算、连通区域分析、轮廓等都算是
但在OpenCV 4中,阈值的结果可能也是彩色图像,开闭运算的输入就是二值化图像… 这个概念可能是错的,因为我还没有从头处理开闭运算。
所以,还是自己按自己的标准来处理,利于理解就行,无所谓对错

inRange

OpenCV中的inRange()函数可以实现图像的二值化,其功能是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)。函数的语法格式如下:

void cv::inRange(InputArray _src, InputArray _lowerb, InputArray _upperb, OutputArray _dst);

其中,_src表示输入图像,可以是灰度图像或彩色图像;_lowerb表示下界的阈值,可以是一个标量值或与输入图像通道数相同的数组;_upperb表示上界的阈值,与_lowerb的类型相同,指定上界阈值;_dst表示输出图像,用于存储计算得到的阈值图像。
在这里插入图片描述
二值图像,可作为copyTo的参数,实现原图的部分拷贝
在这里插入图片描述
具体实现代码:

    cv::Mat originMat = dstMat.clone();int paramIndex = 0;bool combineMaskFlag = GetParamValue_Bool(paramIndex++);    // 0 - 过滤原图显示int min0 = GetParamValue_Int(paramIndex++);   // 1 - 通道0下限int max0 = GetParamValue_Int(paramIndex++);   // 2 - 通道0上限int min1 = GetParamValue_Int(paramIndex++);   // 3 - 通道1下限int max1 = GetParamValue_Int(paramIndex++);   // 4 - 通道1上限int min2 = GetParamValue_Int(paramIndex++);   // 5 - 通道2下限int max2 = GetParamValue_Int(paramIndex++);   // 6 - 通道2上限int dim = dstMat.channels();cv::Mat maskMat;if(dim == 1)inRange(dstMat, Scalar(min0), Scalar(max0), dstMat);if(dim == 2)inRange(dstMat, Scalar(min0, min1), Scalar(max0, max1), dstMat);if(dim >= 3)inRange(dstMat, Scalar(min0, min1, min2), Scalar(max0, max1, max2), dstMat);if(combineMaskFlag)originMat.copyTo(dstMat, dstMat);

基准偏差过滤

二值化本质上是针对各像素点进行逻辑判断处理。想明白这点,那就可以实现色通,即在指定彩色颜色相邻区域内OK,其余颜色不再关心。比如绿幕抠图,那就把绿色颜色干掉,只留下其余部分,也就是前景。好象这里说反了,不过理解起来是一样的。
基准偏差,那就是有基准,有偏差,在这个范围内是期望的,出了这个范围就不OK
在这里插入图片描述
基准可以是灰度、单通道或彩色,代码写起来很简单,我整成功能函数,以便后续调用

    cv::Mat originMat = dstMat.clone();int paramIndex = 0;bool combineMaskFlag = GetParamValue_Bool(paramIndex++);    // 0 - 过滤原图显示bool reverseFlag = GetParamValue_Bool(paramIndex++);        // 1 - 反相int channelType = GetParamValue_Int(paramIndex++);          // 2 - 基准类型QColor baseColor = GetParamValue_Color(paramIndex++);       // 3 - 基准值int delta = GetParamValue_Int(paramIndex++);                // 4 - 偏差量if(channelType != 5) { // 灰度基本偏差if(channelType == 4)    // 灰度图dstMat = CvHelper::ToMat_GRAY(dstMat);else {  // 目标单通道// 首先要确保有相应的通道存在int dstChannelNumber = channelType + 1;if(dstChannelNumber == 2)dstChannelNumber = 3;if(dstMat.channels() < dstChannelNumber)dstMat = CvHelper::ChangeMatDim(dstMat, dstChannelNumber);std::vector<cv::Mat> channels;split(dstMat, channels);dstMat = channels[channelType];}dstMat = CvHelper::BuildTransMaskMat(dstMat, baseColor.red() % 0x100, delta);} else { // 彩色基本偏差dstMat = CvHelper::BuildTransMaskMat(dstMat, baseColor, delta);}if(reverseFlag)bitwise_not(dstMat, dstMat);if(combineMaskFlag)originMat.copyTo(dstMat, dstMat);// 生成MASK屏蔽图形 - 彩色基准偏差 - 色通 -> transColor ± delta之间通过,之外不过
Mat CvHelper::BuildTransMaskMat(cv::Mat &srcMat, QColor transColor, BYTE delta) {cv::Mat bgrMat = ToMat_BGR(srcMat);BYTE r = transColor.red();BYTE g = transColor.green();BYTE b = transColor.blue();BYTE maxR = std::min(255, int(r + delta));BYTE minR = std::max(0,   int(r - delta));BYTE maxG = std::min(255, int(g + delta));BYTE minG = std::max(0,   int(g - delta));BYTE maxB = std::min(255, int(b + delta));BYTE minB = std::max(0,   int(b - delta));cv::Mat maskMat;inRange(bgrMat, Scalar(minB, minG, minR), Scalar(maxB, maxG, maxR), maskMat);return maskMat;
}
// 生成MASK屏蔽图形 - 灰度基准偏差 - 灰通 -> transByte ± delta之间通过,之外不过
Mat CvHelper::BuildTransMaskMat(cv::Mat &srcMat, BYTE transByte, BYTE delta) {cv::Mat grayMat = ToMat_GRAY(srcMat);cv::Mat resultMat(grayMat.rows, grayMat.cols, CV_8UC1);BYTE * pSrc = grayMat.data;BYTE * pDst = resultMat.data;int low = transByte - delta, high = transByte + delta;BYTE LOW = std::max(0, low);BYTE HIGH = std::min(0xFF, high);for(int row = 0; row < grayMat.rows; ++row)for(int col = 0; col < grayMat.cols; ++col) {BYTE v = *pSrc++;BYTE value = 0x0;if(IS_IN_RANGE(v, LOW, HIGH))value = 0xFF;*pDst++ = value;}return resultMat;
}

在这里插入图片描述

分量偏差过滤

与基准偏差过滤对应的是分量偏差过滤,即各像素点分量差在目标范围内/外作为选择判断的基准。代码就太简单了。运行效果如下图所示。
在这里插入图片描述
为更实用,在逻辑处理前,先将图像转化为RGB三通道,不含A通道即可。

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

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

相关文章

test dbtest-02-Liquibase 是一个数据库变更管理工具

拓展阅读 DbUnit-01-数据库测试工具入门介绍 database tool-01-flyway 数据库迁移工具介绍 什么是 Liquibase&#xff1f; Liquibase 是一种开源的数据库架构变更管理解决方案&#xff0c;它使你能够轻松地管理数据库变更的修订版本。 Liquibase使得参与应用程序发布流程的…

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…

Java经典框架之SpringSecurity

SpringSecurity Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。 课程内容的介绍 1. SpringSecurity基本应用…

wps将姓名处理格式为:姓**

1.打开wps&#xff0c;在要处理数据右侧一个单元格 输入公式&#xff1a;LEFT(A1,1)&"**"&#xff0c;然后回车 2.按住ctrl和处理好的数据的右下角小方框&#xff0c;往下拖动即可生成格式为&#xff1a;姓** 格式的数据 3.复制生成的数据&#xff0c;右键选择 “…

springboot日志

1、日志用途 故障排查和调试&#xff1a;当项目出现异常或者故障时&#xff0c;日志记录可以快速帮助我们定位到异常的部分以及知道异常的原因。性能监测和优化&#xff1a;通过在关键代码路径中添加日志记录&#xff0c;可以了解应用程序的性能表现&#xff0c;并根据性能表…

MT8766安卓核心板规格参数_MTK8766核心板模块方案定制

MT8766安卓核心板&#xff1a;高性能、稳定可靠、集成度高的一体化解决方案 MT8766安卓核心板采用联发科MTK8766四核4G模块方案&#xff0c;是一款高度集成的安卓一体板。四核芯片架构&#xff0c;主频可达到2.0GHz&#xff0c;支持国内4G全网通。12nm制程工艺&#xff0c;支持…

引导过程与服务控制

一、开机启动的完整过程 bios加电自检测-------mbr------grub----------加载内核文件------------启动第一个进程 简述&#xff1a;加电后bios程序会自检硬件&#xff0c;硬件无故障&#xff0c;会根据第一启动项去找内核&#xff0c;一般来说&#xff0c;第一启动项是硬盘&a…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口&#xff1f; 二、端口的定义和作用 &#xff08;一&#xff09;TCP协议和UDP协议 &#xff08;二&#xff09;端口的定义 &#xff08;三&#xff09;在TCP/IP体系中&#xff0c;端口(TCP和UDP)的作用 &#xff08;…

使用GPTs+Actions自动获取第三方数据

目录 安装插件与GPT对话联网插件首先,创建GPTs。 Voxscript 官网:https://voxscript.awt.icu/index.htmlOpenAI Schema:https://voxscript.awt.icu/swagger/v1/swagger.yamlServer URL: servers: url: https://voxscript.awt.icu安装插件 要使用这个插件&

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中&#xff0c;我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序&#xff0c;就是那个让您的鞋子焕然一新的魔法师。通过这个小程序&#xff0c;您可以在线预约、支付&#xff0c;查询洗鞋订单&#xff0c;并与洗鞋店铺进行互动&#xff0c;轻松享受专业的洗鞋服…

HarmonyOS4.0系统性深入开发12 卡片数据交互说明

卡片数据交互说明 ArkTS卡片框架提供了updateForm()接口和requestForm()接口主动触发卡片的页面刷新。 接口是否系统能力约束updateForm否1. 提供方调用。2. 提供方仅允许刷新自己的卡片&#xff0c;其他提供方的卡片无法刷新。requestForm是1. 使用方调用。2. 仅允许刷新添加…

数字图像处理(3)——频域图像增强

&#x1f525;博客主页&#xff1a;是dream &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;贤才&#xff0c;难进易出&#xff1b;庸才&#xff0c;易进易初出&#xff1b;…

Character Controller Smooth

流畅的角色控制器 Unity的FPS解决方案&#xff01; 它是一种具有非常平滑运动和多种设置的解决方案&#xff1a; - 移动和跳跃 - 坐的能力 - 侧翻角度 - 不平整表面的处理 - 惯性守恒 - 重力 - 与物理物体的碰撞。 - 支持没有家长控制的平台 此解决方案适用于那些需要角色控制器…

Jmeter的安装与快速使用(做并发测试)

1、了解 JMeter是一款开源的性能测试工具&#xff0c;它主要用于模拟多种负载条件下的应用程序或服务器的性能和功能。JMeter可以发送不同类型的请求&#xff0c;如HTTP、HTTPS、FTP、SOAP、REST等&#xff0c;并且可以模拟多种负载类型&#xff0c;例如并发用户、线程组、定时…

正则表达式 详解,10分钟学会

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论正则表达式。 正则表达式是一种用于匹配和操作文本的工具&#xff0c;常用于文本查找、文本替换、校验文本格式等场景。 正则表达式不仅是写代码时才会使用&#xff0c;在平常使用的很多文本编辑软件&#xff0c;都…

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2…

案例分享:Qt多国语言输入法软键盘

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135346374 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

aspose通过开始和结束位置关键词截取word另存为新文件

关键词匹配实体类&#xff1a; Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词&#xff0c;多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…

【操作系统xv6】学习记录4 -CPU上下文:进程上下文、线程上下文、中断上下文

什么是cpu上下文 CPU 寄存器和程序计数器就是 CPU 上下文&#xff0c;因为它们都是 CPU 在运行任何任务前&#xff0c;必须的依赖环境。 什么是 CPU 上下文切换 先把前一个任务的 CPU 上下文&#xff08;也就是 CPU 寄存器和程序计数器&#xff09;保存起来&#xff0c;然后…

Flutter+Go_Router+Fluent_Ui仿阿里网盘桌面软件开发跨平台实战-买就送仿小米app开发

Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前 Flutter 已经支持 iOS、Android、Web、Windows、macOS、Linux 的跨平台开发。 Flutter官方介绍&#xff0c;目前Flutte…