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通道即可。

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

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

相关文章

docker安装postgresql15或者PG15

1. 查询版本 docker search postgresql docker pull postgres:15.3 # 也可以拉取其他版本2.运行容器并挂载数据卷 mkdir -p /data/postgresql docker run --name postgres \--restartalways \-e POSTGRES_PASSWORDpostgresql \-p 5433:5432 \-v /data/postgresql:/var/lib/p…

工业制造领域,折弯工艺如何进行优化?

若将消费互联网与工业互联网相比较&#xff0c;消费互联网就好似一片宽度为1000米、深度仅有1米的水域&#xff0c;而工业互联网则类似于宽度有1000米、深达10000米的海域。消费互联网因为被限制了深度&#xff0c;便只能在浅显的焦虑中创造出一种消费趋势。相较之下&#xff0…

数据库迁移工具包:DBSofts ESF Database Migration Crack

ESF 数据库迁移工具包 - 11.2.17 允许您通过 3 个步骤在各种数据库格式之间迁移数据&#xff0c;无需任何脚本&#xff01; DBSofts ESF Database Migration它极大地减少了与以下任何数据库格式之间迁移的工作量、成本和风险&#xff1a;Oracle、MySQL、MariaDB、SQL Server、…

(15)Linux 进程创建与终止函数forkslab 分派器

前言&#xff1a;本章我们主要讲解进程的创建与终止&#xff0c;最后简单介绍一下 slab 分派器。 一、进程创建&#xff08;Process creation&#xff09; 1、分叉函数 fork 在 中&#xff0c; fork 函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新的进程。 …

html引入react以及hook的使用

html引入react 效果代码注意 效果 分享react demo片段的时候&#xff0c;如果是整个工程项目就有点太麻烦了&#xff0c;打开速度慢&#xff0c;文件多且没必要&#xff0c;这个时候用html就很方便。 在html中能正常使用useState 和 useEffect 等hook。 代码 <!DOCTYPE htm…

助力成长的开源项目 —— 筑梦之路

闯关式 SQL 自学&#xff1a;sql-mother 免费的闯关式 SQL 自学教程网站&#xff0c;从 0 到 1 带大家掌握常用 SQL 语法&#xff0c;目前一共有 30 多个关卡&#xff0c;希望你在通关的时候&#xff0c;变身为一个 SQL 高手。除了闯关模式之外&#xff0c;这个项目支持自由选…

Redis(二)数据类型

文章目录 官网备注十大数据类型StringListHashSetZSetBitmapHyperLogLog&#xff1a;GEOStreamBitfield 官网 英文&#xff1a;https://redis.io/commands/ 中文&#xff1a;http://www.redis.cn/commands.html 备注 命令不区分大小写&#xff0c;key区分大小写帮助命令help…

阿里云服务器开放端口Oracle 1521方法教程

阿里云服务器ECS端口是在安全组设置的&#xff0c;Oracle数据库1521端口号开放是在安全组中添加规则来实现的&#xff0c;阿里云服务器网aliyunfuwuqi.com来详细说下阿里云服务器开放Oracle 1521端口方法教程&#xff1a; 阿里云服务器开放Oracle 1521端口 在阿里云服务器ECS…

前端Web系统架构设计

文章目录 1.目录结构定义2. 路由封装2.1 API路由定义2.2 组件路由定义 3. Axios请求开发4. 环境变量封装5. storage模块封装(sessionStorage, localStorage)6. 公共函数封装(日期,金额,权限..)7. 通用交互定义(删除二次确认,类别,面包屑...)8. 接口全貌概览 1.目录结构定义 2. …

mysql 单表 操作 最大条数验证 以及优化

1、背景 开车的多年老司机&#xff0c;是不是经常听到过&#xff0c;“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”&#xff0c;“你这个表数据都马上要到 2000w 了&#xff0c;难怪查询速度慢”。 2、实验 实验一把看看… 建一张表 CREATE TABL…

机器学习-基于Word2vec搜狐新闻文本分类实验

机器学习-基于Word2vec搜狐新闻文本分类实验 实验介绍 Word2vec是一群用来产生词向量的相关模型&#xff0c;由Google公司在2013年开放。Word2vec可以根据给定的语料库&#xff0c;通过优化后的训练模型快速有效地将一个词语表达成向量形式&#xff0c;为自然语言处理领域的应…

STC进阶开发(三)蜂鸣器、RTC时钟、I2C总线、外部中断、RTC闹钟设置、RTC计时器设置

前言 这一期我们首先学习如何让蜂鸣器响起来&#xff0c;并且如何让蜂鸣器发出简单的歌曲&#xff0c;然后我们介绍RTC时钟&#xff0c;要想明白RTC时钟&#xff0c;我们还需要先介绍I2C总线和外部中断。接下来就开始这一期的学习吧&#xff01; 蜂鸣器 简单介绍 蜂鸣器是一种…

论文笔记:CellSense: Human Mobility Recovery via Cellular Network Data Enhancement

1 intro 1.1 背景 1.1.1 蜂窝计费记录&#xff08;CBR&#xff09; 人类移动性在蜂窝网络上的研究近些年得到了显著关注&#xff0c;这主要是因为手机的高渗透率和收集手机数据的边际成本低蜂窝服务提供商收集蜂窝计费记录&#xff08;CBR&#xff09;用于计费目的&#xf…

哲学家进餐问题-第三十二天

目录 问题描述 解决问题 结论 问题描述 解决问题 1、 关系分析&#xff1a;找出题目中描述的各个进程&#xff0c;分析它们之间的同步、互斥关系 系统中有5个哲学家进程&#xff0c;5位哲学家与左右邻居对其中间筷子的访问是互斥关系 2、整理思路&#xff1a;根据各进程的操…

ubuntu terminator 非常好用的护眼配置

安装 sudo apt install terminator 配置文件&#xff1a;sudo gedit ~/.config/terminator/config &#xff08;如果没有就创建&#xff09; 配置如下&#xff1a; [global_config] handle_size -3 title_transmit_fg_color "#000000" title_trans…

KBDNO1.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复

不少小伙伴&#xff0c;求助电脑报错“KBDNO1.DLL文件缺失&#xff0c;软件或游戏无法启动或运行”&#xff0c;应该怎么办&#xff1f; 首先&#xff0c;我们先来了解“KBDNO1.DLL文件”是什么&#xff1f; KBDNO1.DLL是Windows操作系统中的一个动态链接库文件&#xff0c;主…

Java基础进阶(学习笔记)

注&#xff1a;本篇的代码和PPT图片来源于黑马程序员&#xff0c;本篇仅为学习笔记 static static 是静态的意思&#xff0c;可以修饰成员变量&#xff0c;也可以修饰成员方法 修饰成员的特点&#xff1a; 被其修饰的成员, 被该类的所有对象所共享 多了一种调用方式, 可以通过…

MACOS Atrust服务异常

MAC版Atrust服务异常 点击进入办公后出现提示其一&#xff1a; 核心服务未启动&#xff0c;部分功能存在异常&#xff0c;确定重新启动吗&#xff1f; 可能的原因&#xff1a; 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后&#xff0c;出现提示&#x…

Spring Boot 如何使用 Maven 实现多环境配置管理

Spring Boot 如何使用 Maven 实现多环境配置管理 实现多环境配置有以下几个重要原因&#xff1a; 适应不同的部署环境&#xff1a;在实际部署应用程序时&#xff0c;通常会有多个不同的部署环境&#xff0c;如开发环境、测试环境、生产环境等。每个环境可能需要不同的配置&…

虹科方案丨从困境到突破:TigoLeap方案引领数据采集与优化变革

来源&#xff1a;虹科工业智能互联 虹科方案丨从困境到突破&#xff1a;TigoLeap方案引领数据采集与优化变革 原文链接&#xff1a;https://mp.weixin.qq.com/s/H3pd5G8coBvyTwASNS_CFA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 在数字化工厂和智能制造时…