OpenCV4-图像二值化

2023-11-14

OpenCV4-图像二值化

图像二值化

1.环境配置

OpenCV版本:OpenCV4.1

2.图像二值化

二值图像:图像中的像素灰度值无论在什么数据类型中都只有最大值和最小值两种取值。这种“非黑即白”的图像称为二值图像。

将非二值图像经过计算变成二值图像的过程称为图像的二值化。

3. threshold()函数

 double cv::threshold(InputArray src,
                      OutputArray dst,
                      double thresh,
                      double maxval,
                      int type)
 /*
  * src:待二值化的图像,图像只能是CV_8U和CV_32F两种数据类型。
  * 对于图像通道数目的要求与选择的二值化方法相关。
  * dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数。
  * thresh:二值化的阈值
  * maxval:二值化过程的最大值,它只在THRESH_BINARY和THRESH_BINARY_INV
  * 两种二值化方法中才使用。
  * type:选择图像二值化方法的标志
  */
type标志参数 简记 作用
THRESH_BINARY 0 灰度值大于阈值的为最大值,其他值为0
THRESH_BINARY_INV 1 灰度值大于阈值的为0,其他值为最大值
THRESH_TRUNC 2 灰度值大于阈值的为阈值,其他值不变
THRESH_TOZERO 3 灰度值大于阈值的不变,其他值为0
THRESH_TOZERO_INV 4 灰度值大于阈值的为0,其他值不变
THRESH_OTSU 8 大津法自动寻求全局阈值
THRESH_TRIANGLE 16 三角形法自动寻找全局阈值

4.每种标志对应的二值化原理和需要的参数

4.1 THRESH_BINARY和THRESH_BINARY_INV

这两个标志是相反的二值化方法,THRESH_BINARY是将灰度值与阈值(第三个参数thresh)进行比较,如果灰度值大于阈值,就将灰度值改为函数中第四个参数maxval的值,否则将灰度值改为0.THRESH_BINARY_INV标志正好与这个过程相反,如果灰度值大于阈值,就将灰度值改为0,否则将灰度值改为maxval的值。

公式:

 

 

4.2 THRESH_TRUNC

这个标志相当于重新给图像的灰度值设定一个新的最大值,将大于新的最大值的灰度值全部重新设置为新的最大值,具体逻辑为将灰度值与阈值thresh进行比较,如果灰度值大于thresh,则将灰度值改为thresh,否则保持灰度值不变。这种方法没用使用到函数中的第四个参数maxval的值,因此maxval的值对本方法不产生影响。

公式:

 

4.3 THRESH_TOZERO和THRESH_TOZERO_INV

这两个标志是相反的阈值比较方法,THRESH_TOZERO表示将灰度值与阈值thresh进行比较,如果灰度值大于thresh,则将保持不变,否则将灰度值改为0。THRESH_TOZERO_INV方法与其相反,将灰度值与阈值thresh进行比较,如果灰度值小于或等于thresh,则将保持不变,否则将灰度值改为0。这两种方法没有使用到函数中的第四个参数maxval的值,因此maxval的值对本方法不产生影响。

公式:

        

4.4 THRESH_OTSU和THRESH_TRIANGLE

这两种标志是获取阈值的方法,并不是阈值比较方法的标志,这两个标志可以与前面5中标志一起使用,例如“THRESH_BINARY | THRESH_OTSU”。前面5种标志在调用函数时都需要人为地设置阈值,如果对图像不太了解,设置的阈值不合理,就会对处理后的效果造成严重的影响。

这两个标志分别表示利用大津法(OTSU)和三角形法(TRIANGLE)结合图像灰度值分布特性获取二值化的阈值,并将阈值以函数返回值的形式给出。因此,如果该函数最后一个参数设置了这两个标志中的任何一个,那么该函数第三个参数thresh将由系统自动给出,但是在调用函数时仍然不能默认,只是程序不会使用这个数值。需要注意的是,到目前,OpenCV4中针对这两个标志只支持输入CV_8UC1类型的图像。

5.adaptiveThreshold()函数

threshold()函数全局只使用一个阈值,在实际情况中,由于光照不均匀以及阴影的存在,全局只有一个阈值会使得在阴影处的白色区域也会被函数二值化成黑色,因此adaptiveThreshold()函数提供了两种全局自适应阈值的二值化方法。

 void cv::adaptiveThreshold(InputArray src,
                            OutputArray dst,
                            double maxValue,
                            int adaptiveMethod,
                            int thresholdType,
                            int blockSize,
                            double C)
 /*
  * src:待二值化的图像,图像只能是CV_8UC1数据类型
  * dst:二值化后的图像,与输入图像具有相同的尺寸,数据类型
  * maxValue:二值化的最大值
  * adaptiveMethod:自适应确定阈值的方法,
  * 分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C两种
  * thresholdType:选择图像二值化方法的标志,只能是THRESH_BINARY和THRESH_BINARY_INV
  * blockSize:自适应确定阈值的像素邻域大小,一般为3、5、7的奇数
  * C:从平均值或者加权值中减去的常数,可以为正,也可以为负
  */

该函数将灰度图转换为二值图像,通过均值法和高斯法自适应地计算blockSize*blockSize邻域内的阈值,之后进行二值化。

6.例程

 #include <iostream>
 #include <opencv2/opencv.hpp>
 ​
 using namespace std;
 using namespace cv;
 ​
 int main(void)
 {
     Mat img = imread("lena.png");
     if (img.empty())
     {
         cout << "请确认图像文件名称是否正确" << endl;
         return -1;
     }
     imshow("img", img);
 ​
     Mat gray;
     cvtColor(img, gray, COLOR_BGR2GRAY);
     imshow("gray", gray);
     Mat img_B, img_B_V, gray_B, gray_B_V, gray_T, gray_T_V, gray_TRUNC;
 ​
     // 彩色图像二值化
     threshold(img, img_B, 125, 255, THRESH_BINARY);
     threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV);
     imshow("img_B", img_B);
     imshow("img_B_V", img_B_V);
 ​
     // 灰度图BINARY二值化
     threshold(gray, gray_B, 125, 255, THRESH_BINARY);
     threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV);
     imshow("gray_B", gray_B);
     imshow("gray_B_V", gray_B_V);
 ​
     // 灰度图像TOZERO变换
     threshold(gray, gray_T, 125, 255, THRESH_TOZERO);
     threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV);
     imshow("gray_T", gray_T);
     imshow("gray_T_V", gray_T_V);
 ​
     // 灰度图像TRUNC变换
     threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC);
     imshow("gray_TRUNC", gray_TRUNC);
 ​
     // 灰度图像大律法和三角形法二值化
     Mat img_Thr = imread("threshold.png", IMREAD_GRAYSCALE);    
     Mat img_Thr_O, img_Thr_T;
     threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU);
     threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE);
     imshow("img_Thr", img_Thr);
     imshow("img_Thr_O", img_Thr_O);
     imshow("img_Thr_T", img_Thr_T);
 ​
     // 灰度图像自适应二值化
     Mat adaptive_mean, adaptive_guass;
     adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C,
         THRESH_BINARY, 55, 0);
     adaptiveThreshold(img_Thr, adaptive_guass, 255, ADAPTIVE_THRESH_GAUSSIAN_C,
         THRESH_BINARY, 55, 0);
     imshow("adaptive_mean", adaptive_mean);
     imshow("adaptive_guass", adaptive_guass);
 ​
     waitKey(0);
 ​
     return 0;
 }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV4-图像二值化 的相关文章

  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • C/C++ 中随机数生成器的实现[重复]

    这个问题在这里已经有答案了 我对 C 中随机数生成器的实现有点困惑 它也与 C 中的明显不同 如果我理解正确 对 srand seed 的调用会以某种方式初始化可通过 rand 访问的隐藏变量 种子 该变量又将函数指向预先生成的序列 例如例
  • 如何将 C++ 类包装在基于 C 的 dll 或基于 CLI 的 dll 中?

    我被告知将我用 C 编写的类导入到 dll 中 然后在 c 应用程序中使用该 dll 下列的本指南 https stackoverflow com questions 4555961 how to use a class in dll我创建
  • C++ - 模板专业化和部分专业化

    我一直在互联网和 stackoverflow 上寻找具体的答案 但我似乎找不到 我必须创建一个通用类 然后实现特定的功能 我的具体说明是 您需要使用模板表达式参数以及模板类专业化和部分专业化 我有一个模板类 template
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 浏览器收集哪些值作为回发数据?

    当页面被发送回服务器时 浏览器收集每个控件的当前值并将其粘贴到一个字符串中 然后 该回发数据通过 HTTP POST 发送回服务器 Q1 除了控件的 Text 属性和 SelectedIndexchanged 因此除了用户输入数据 之外 控
  • 隐形打开的弹出窗口

    第二天就解决这个问题 要重现 请创建新的 WPF 应用程序 xaml
  • 如何在 C++ 的子目录中创建文件?

    这是我的代码 如何在子目录联系人中创建文件 每次创建该文件时 它都会出现在与我的程序相同的目录中 int main ofstream myfile contacts myfile open a myfile close 在构造函数中指定完整
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • initializer_list 和默认构造函数重载决策

    include
  • Type_traits *_v 变量模板实用程序顺序无法编译

    看过了这个答案 https stackoverflow com a 31763111 7151494 我试图想出一个变量模板从中获取代码的实用程序 template
  • 在 C++ 中处理音频缓冲区时,如何执行从 float -> double -> float 的转换

    我目前正在开发一个应用程序 其中音频样本帧在以下回调中进行处理 void Eav07AudioProcessor processBlock AudioSampleBuffer buffer for int channel 0 channel
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 从 ef core 的子集合中删除一些项目

    我有一个父表和子表 其中父表与子表具有一对多关系 我想删除一些子项 并且希望父项的子集合反映该更改 如果我使用删除选定的子项RemoveRange 那么子集合不会更新 如果我使用Remove从子集合中删除子集合然后 显然 它不如使用效率高R
  • 在 C# 中生成随机值

    如何使用以下命令生成随机 Int64 和 UInt64 值RandomC 中的类 这应该可以解决问题 这是一个扩展方法 因此您可以像调用普通方法一样调用它Next or NextDouble上的方法Random目的 public stati
  • 使 C# 编译器相信执行将在成员返回后停止

    我认为目前这是不可能的 或者这是否是一个好主意 但这是我刚才正在考虑的事情 我使用 MSTest 对我的 C 项目进行单元测试 在我的一项测试中 我执行以下操作 MyClass instance try instance getValue
  • Intel 和 AMD 处理器有相同的汇编程序吗?

    C语言被用来编写Unix以实现可移植性 使用不同编译器编译的同一个C语言程序会产生不同的机器指令 为什么 Windows 操作系统能够在两者上运行Intel https en wikipedia org wiki Intel and AMD
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route

随机推荐

  • eureka缓存

    AP系统 服务端 三级缓存 缓存 说明 一级 本地缓存 实时更新 客户端注册时数据保存到这 二级 读写缓存 实时更新 客户端注册 下线 故障时缓存失效 读取读写缓存找不到数据时 去一级缓存读取并保存到二级缓存 三级 读缓存 周期更新 默认3
  • watch的使用方法

    watch简单监听属性 监听对象就不要用这种写法 data return num 1 watch num newval oldval newval 是新值 oldval 是修改前的值 num有变化之后所执行的代码块 console log
  • 学习总结Q

    学习总结 学习内容 Java HashSet 学习产出 HashSet 基于 HashMap 来实现的 是一个不允许有重复元素的集合 HashSet 允许有 null 值 HashSet 是无序的 即不会记录插入的顺序 HashSet 不是
  • MySQL 的CASE WHEN 语句使用说明

    介绍mysql数据库中case when语句的用法 首先介绍case when语句的基础知识 然后提供了相关例子 1 mysql数据库中CASE WHEN语句 case when语句 用于计算条件列表并返回多个可能结果表达式之一 CASE
  • 【C++11智能指针】shared_ptr的初始化、拷贝构造和拷贝赋值、移动构造和移动赋值

    文章目录 1 智能指针概述 2 shared ptr的初始化 2 1 shared ptr和new结合使用 直接初始化 2 2 make shared函数 3 shared ptr的拷贝构造和拷贝赋值 4 shared ptr的移动构造和移
  • 函数名称前面加引用“&”或指针符号“*”的意思

    学习笔记 一 函数名称前面加引用符号 代表该函数返回值类型是引用 如 int operate 二 函数名称前面加指针符号 代表它是函数指针 函数指针是一个指向函数的指针 函数指针表示一个函数的入口地址 使用函数指针的好处就是在处理 在运行时
  • 解析敏捷开发流程之Scrum:3个角色、5个会议、12原则

    本文主要从Scrum的定义和目的 敏捷宣言 Scrum中的人员角色 Scrum开发流程 敏捷的12原则等几方面帮助大家理解Scrum敏捷开发的全过程 一 Scrum的定义和目的 Scrum是一个用于开发和维护复杂产品的框架 是一个增量的 迭
  • MySql在Windows下查看日志

    大体记录mysql查看日志的方法 并不具体 1 查看是否开启了日志 show variables like log bin value是ON表示已开启 如果没开启执行第二步 2 开启日志 在mysql的配置文件mysql ini中的 mys
  • react 开发环境下 解决 Uncaught ReferenceError: process is not defined 异常:

    react 开发环境下 解决 Uncaught ReferenceError process is not defined 异常 package json中添加 resolutions react error overlay 6 0 9 锁
  • 什么是AQS?

    AQS AbstractQueuedSynchronizer 是 Java 中用于构建同步器的抽象基类 它提供了一种强大的框架 使得可以相对容易地构建各种同步工具 如锁 信号量 倒计数器等 AQS 是 Java 并发包中的核心组件之一 它在
  • JAVA--Map集合详解

    特点 该集合存储键 key 值 value 对 一对一对往里存 而且要保证键 key 的唯一性 Map集合和Set集合很像 其实Set集合底层就是使用了Map集合 什么时候使用Map集合 当数据之间存在映射关系时 优先考虑Map集合 Map
  • MySQL的基础部分(基础部分完结)

    MySQL的基础部分 基础部分完结 文章目录 MySQL的基础部分 基础部分完结 知识小回顾 小案例部分 分页查询 总结多子句查询 多表查询 重点 难点 自连接 多行子查询 小结 子查询临时表 any all关键字的使用 mysql多列子查
  • Shell脚本交互之:自动输入密码

    平时在控制台输入指令如 sudo ssh ftp或者修改admin权限的文件时候都会要求输入password 但是在she ll脚本运行过程中该如何交互实现自动输入密码呢 下面总结三种实现方法 一 重定向 用重定向方法实现交互的前提是指令需
  • 录播系统服务器大全,专业高清录播服务器 全高清录播系统 系统设计精美

    高清录播服务器 支持多个会议 多速率 多种录制模式对会议随心所欲的进行录制点播 可以配合当前各种标准H 323 SIP的MCU和终端产品 表现出良好的兼容性 标配5组20路同时录制 大可支持20组视频会议录制 录制中的视频会议的音频 视频和
  • 服务部署之每个主机的单个服务实例

    背景 您已应用微服务架构模式并将系统架构为一组服务 每个服务都部署为一组服务实例 以实现吞吐量和可用性 问题 如何打包和部署服务 诉求 服务使用各种语言 框架和框架版本编写 每个服务由多个服务实例组成 用于吞吐量和可用性 服务必须可独立部署
  • 【实例分割】4、YOLACT: Real-time Instance Segmentation

    文章目录 摘要 1 引言 2 相关工作 3 YOLACT 3 1 模板的产生 3 2 Mask 系数 3 3 Mask集成 3 4 其他情况 4 检测器 5 其他贡献 6 结果 6 1 实例分割结果 6 2 Mask质量 6 3 动态稳定性
  • SnakeGame(贪吃蛇游戏)

    目录 一 前言 二 项目介绍 1 游戏的操作方式 2 开发的过程中的注意事项 1 图像的左右问题 2 摄像头的画面尺寸问题 三 游戏的实现要点 1 选择第三方库 2 找到关键点并标记 3 创建一个类来保存关于游戏的所有功能 4 定义函数进行
  • spring & bean

    1 spring的三种实例化bean方法 2 配置spring管理bean的作用域 3 spring管理的bean的生命周期 bean什么时候进行实例化 spring容器启动的时候 还是在调用geatBean 方法的时候 延时初始化 指定b
  • chatgpt赋能python:Python创建5×5矩阵(Matrix)教程

    Python创建5 5矩阵 Matrix 教程 Python是一种广泛使用的高级编程语言 其具有简单易用 可读性强 支持多种编程范式等特点 已经成为数据分析 科学计算与机器学习等领域必备的编程工具之一 在Python的诸多应用场景中 创建矩
  • OpenCV4-图像二值化

    OpenCV4 图像二值化 图像二值化 1 环境配置 OpenCV版本 OpenCV4 1 2 图像二值化 二值图像 图像中的像素灰度值无论在什么数据类型中都只有最大值和最小值两种取值 这种 非黑即白 的图像称为二值图像 将非二值图像经过计