OpenCV(八):图像二值化
目录
1.固定值二值化
2.自适应阈值二值化
3.Android JNI完整代码
1.固定值二值化
固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的像素被设置为白色,而小于或等于阈值的像素被设置为黑色。以下是关于OpenCV固定阈值二值化的一些重要知识点:
1.阈值函数:在OpenCV中,固定阈值二值化可以使用 threshold() 函数来实现。该函数的原型如下:
double threshold(InputArray src, OutputArray dst, double thresh, double maxValue, int thresholdType);
src:输入图像,通常为灰度图像。dst:输出二值图像,与输入图像具有相同的大小和类型。thresh:固定阈值,用于将像素分类为黑色或白色。maxValue:分配给大于阈值的像素的像素值。thresholdType:阈值类型,用于指定阈值化的方式,如THRESH_BINARY、THRESH_BINARY_INV等。
2.阈值类型:使用 thresholdType 参数可以选择不同的固定阈值化类型,以满足特定需求。一些常用的阈值类型包括:
THRESH_BINARY:二进制阈值化,大于阈值的像素值设为maxValue,小于等于阈值的像素值设为 0。THRESH_BINARY_INV:反二进制阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值设为maxValue。THRESH_TRUNC:截断阈值化,大于阈值的像素值设为阈值,小于等于阈值的保持不变。THRESH_TOZERO:截断到零阈值化,大于阈值的像素值保持不变,小于等于阈值的像素值设为 0。THRESH_TOZERO_INV:反截断到零阈值化,大于阈值的像素值设为 0,小于等于阈值的像素值保持不变。
3.例子

(原图)
1.将彩色图像image转换为灰度图像
Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);
(灰度图像)
2.彩色图像二值化
Mat img_B,img_B_V;threshold(image,img_B,125,255,THRESH_BINARY);imwrite("/sdcard/DCIM/img_B.png",img_B);

3.灰度图BINARY二值化
Mat gray_B,gray_B_V;threshold(gray,gray_B,125,255,THRESH_BINARY);threshold(gray,gray_B_V,125,255,THRESH_BINARY_INV);imwrite("/sdcard/DCIM/gray_B.png",gray_B);imwrite("/sdcard/DCIM/gray_B_V.png",gray_B_V);

gray_B gray_B_V
4.灰度图像TOZERO变换
Mat gray_T,gray_T_V;threshold(gray,gray_T,125,255,THRESH_TOZERO);threshold(gray,gray_T_V,125,255,THRESH_TOZERO_INV);imwrite("/sdcard/DCIM/gray_T.png",gray_T);imwrite("/sdcard/DCIM/gray_T_V.png",gray_T_V);


gray_T gray_T_V
5.灰度图像TRUNC变换
Mat gray_TRUNC;threshold(gray,gray_TRUNC,125,255,THRESH_TRUNC);imwrite("/sdcard/DCIM/gray_TRUNC.png",gray_TRUNC);

gray_TRUNC
6.灰度图像大津法和三角形法二值化
Mat img_Thr;cvtColor(image,img_Thr,COLOR_BGR2GRAY);Mat img_Thr_0,img_Thr_T;threshold(img_Thr,img_Thr_0,100,255,THRESH_BINARY|cv::THRESH_OTSU);threshold(img_Thr,img_Thr_T,125,255,THRESH_BINARY|cv::THRESH_TRIANGLE);imwrite("/sdcard/DCIM/img_Thr_0.png",img_Thr_0);imwrite("/sdcard/DCIM/img_Thr_T.png",img_Thr_T);

img_Thr_T img_Thr_0
2.自适应阈值二值化
1.自适应阈值函数:OpenCV中的自适应阈值二值化可以使用 adaptiveThreshold() 函数来实现。该函数的原型如下:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C);
- src:输入图像,通常为灰度图像。
- dst:输出二值图像,与输入图像具有相同的大小和类型。
- maxValue:分配给超过阈值的像素的像素值。
- adaptiveMethod:自适应阈值化方法,用于指定计算局部阈值的方式,可以是 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C。
- thresholdType:阈值化类型,用于指定阈值化的方式,如 THRESH_BINARY、THRESH_BINARY_INV 等。
- blockSize:用于计算局部阈值的像素领域大小。必须是奇数且大于1。
- C:从计算阈值中减去的常数。通常为正值。
2.自适应阈值化方法:使用 adaptiveMethod 参数可以选择不同的自适应阈值化方法,以满足特定需求。在OpenCV中,常见的自适应阈值化方法有两种:
-
ADAPTIVE_THRESH_MEAN_C:根据领域中像素的均值计算局部阈值。
-
ADAPTIVE_THRESH_GAUSSIAN_C:根据领域中像素的加权和(权重为高斯窗口)计算局部阈值。
3.灰度图像转换:在进行自适应阈值二值化之前,要将彩色图像转换为灰度图像。可以使用 cvtColor() 函数将彩色图像转换为灰度图像。
cvtColor(image,img_Thr,COLOR_BGR2GRAY);
4.例子
Mat adaptive_mean,adaptive_gauss;
adaptiveThreshold(img_Thr,adaptive_mean,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0);
adaptiveThreshold(img_Thr,adaptive_gauss,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,55,0);
imwrite("/sdcard/DCIM/adaptive_mean.png",adaptive_mean);
imwrite("/sdcard/DCIM/adaptive_gauss.png",adaptive_gauss);

adaptive_gauss adaptive_mean
3.Android JNI完整代码
#include <jni.h>
#include <string>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <android/log.h>#define LOG_TAG "xxx"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)using namespace cv;
using namespace std;
extern "C"
JNIEXPORT void JNICALL
Java_com_example_myapplication_MainActivity_opencv_1test(JNIEnv *env, jclass clazz,jobject bitmap) {AndroidBitmapInfo info;void *pixels;CV_Assert(AndroidBitmap_getInfo(env, bitmap, &info) >= 0);//判断图片是位图格式有RGB_565 、RGBA_8888CV_Assert(info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||info.format == ANDROID_BITMAP_FORMAT_RGB_565);CV_Assert(AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0);CV_Assert(pixels);//将bitmap转化为Mat类Mat image(info.height, info.width, CV_8UC4, pixels);Mat gray;cvtColor(image,gray,COLOR_BGR2GRAY);imwrite("/sdcard/DCIM/gray23.png",gray);Mat img_B,img_B_V,gray_B,gray_B_V,gray_T,gray_T_V,gray_TRUNC;//彩色图像二值化threshold(image,img_B,125,255,THRESH_BINARY);imwrite("/sdcard/DCIM/img_B.png",img_B);//灰度图BINARY二值化threshold(gray,gray_B,125,255,THRESH_BINARY);threshold(gray,gray_B_V,125,255,THRESH_BINARY_INV);imwrite("/sdcard/DCIM/gray_B.png",gray_B);imwrite("/sdcard/DCIM/gray_B_V.png",gray_B_V);//灰度图像TOZERO变换threshold(gray,gray_T,125,255,THRESH_TOZERO);threshold(gray,gray_T_V,125,255,THRESH_TOZERO_INV);imwrite("/sdcard/DCIM/gray_T.png",gray_T);imwrite("/sdcard/DCIM/gray_T_V.png",gray_T_V);//灰度图像TRUNC变换threshold(gray,gray_TRUNC,125,255,THRESH_TRUNC);imwrite("/sdcard/DCIM/gray_TRUNC.png",gray_TRUNC);//灰度图像大津法和三角形法二值化Mat img_Thr;cvtColor(image,img_Thr,COLOR_BGR2GRAY);Mat img_Thr_0,img_Thr_T;threshold(img_Thr,img_Thr_0,100,255,THRESH_BINARY|cv::THRESH_OTSU);threshold(img_Thr,img_Thr_T,125,255,THRESH_BINARY|cv::THRESH_TRIANGLE);imwrite("/sdcard/DCIM/img_Thr_0.png",img_Thr_0);imwrite("/sdcard/DCIM/img_Thr_T.png",img_Thr_T);Mat adaptive_mean,adaptive_gauss;adaptiveThreshold(img_Thr,adaptive_mean,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0);adaptiveThreshold(img_Thr,adaptive_gauss,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,55,0);imwrite("/sdcard/DCIM/adaptive_mean.png",adaptive_mean);imwrite("/sdcard/DCIM/adaptive_gauss.png",adaptive_gauss);
}
相关文章:
OpenCV(八):图像二值化
目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的…...
《Flink学习笔记》——第十一章 Flink Table API和 Flink SQL
Table API和SQL是最上层的API,在Flink中这两种API被集成在一起,SQL执行的对象也是Flink中的表(Table),所以我们一般会认为它们是一体的。Flink是批流统一的处理框架,无论是批处理(DataSet API&a…...
电脑提示缺少d3dx9_43.dll的问题及5个解决方法
大家好!今天,我将和大家分享一个电脑提示缺少d3dx9_43.dll的问题及其解决方法。这个问题可能会影响到我们在使用电脑时的一些功能,所以掌握这个解决方法对我们来说是非常有帮助的。 首先,我们来了解一下什么是d3dx9_43.dll。d3dx9…...
Linux stat 命令及示例
介绍 该stat命令打印有关文件和文件系统的详细信息。该工具提供有关所有者是谁、修改日期、访问权限、大小、类型等信息。 该实用程序对于故障排除、在更改文件之前获取有关文件的信息以及例行文件和系统管理任务至关重要。 本文stat通过实际示例解释了有关 Linux 命令的所有…...
06-基础例程6
基础例程6 01、WIFI实验—WebServer 实验介绍 连接路由器上网是我们每天都做的事情,日常生活中只需要知道路由器的账号和密码,就可以使用手机或电脑连接到路由器,然后上网。 连接路由器,将ESP32的IP地址等信息通过shell…...
【附安装包】Eplan2022安装教程
软件下载 软件:Eplan版本:2022语言:简体中文大小:1.52G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.5GHz 内存4G(或更高)下载通道①百度网盘丨64位下载链接:https://pan.baidu.co…...
大数据-玩转数据-Flink窗口
一、Flink 窗口 理解 在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击…...
【python爬虫】—豆瓣电影Top250
豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片,涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影ÿ…...
【跟小嘉学 Rust 编程】十五、智能指针
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
Python爬虫基础之正则表达式
目录 一、什么是正则表达式? 二、re.compile()编译函数 三、group()获取匹配结果函数 四、常用匹配规则 4.1匹配单个字符 4.2匹配前字符次数 4.3匹配原生字符串 4.4匹配字符串开头和结尾 4.5分组匹配 五、re.match()开头匹配函数 六、re.search()全文搜索…...
【LeetCode】双指针妙解有效三角形的个数
Problem: 611. 有效三角形的个数 文章目录 题目分析讲解算法原理复杂度Code 题目分析 首先我们来分析一下本题的思路 看到题目中给出的示例 题目的意思很简单,就是将给到的数字去做一个组合,然后看看这三条边是否可以构成三角形。那判断的方法不用我说&a…...
mysql 计算两点之间距离
先说一下我们可能会用到的一些场景,这样同学们可以先评估,该篇文章是否对你有帮助! 场景: 假设 美团,我点外卖时,系统会让我先进行定位,比如我定位在了 A 点,系统就会给我推荐&…...
c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码?
c语言自定义头文件是什么情况下使用?一般在什么情况下引用自定义的头文件?一般在自定义头文件中写什么代码? C语言自定义头文件是一种用来封装函数和变量声明的文件,它通常用于将一组相关的函数和变量的声明集中在一个地方&#…...
electron应用打包成功纪念一下
electron应用打包成功纪念一下,以前曾经行过后来打包各种报错,现在有空就尝试解决一下 首先安装nvm能够方便切换node版本 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 顺利安装后你用nvm list查看node列表时会…...
远程办公中安全远程访问解决方案
什么是安全远程访问 安全的远程访问是一个至关重要的过程,可让您使用互联网从远处完全控制某人的设备。为了确保安全,为受保护的远程访问采取了额外的身份验证和加密措施。 为什么安全远程访问解决方案很重要 当 IT 技术人员从远处帮助人们解决计算机…...
StartUp启动框架-Android启动性能
简述 当谈论Android应用程序的启动性能时,StartUp启动框架是一个不可忽视的关键工具。它旨在优化应用程序的启动过程,确保用户在打开应用时能够迅速获得流畅、高效的体验。让我们来深入了解StartUp框架的作用和重要性,以及它是如何改善Andro…...
Positive Technologies:五分之四的网络攻击具有针对性
Positive Technologies 对 2023 年第二季度的相关网络威胁进行了分析。报告显示,自今年年初以来,有针对性的攻击数量增加了 10%,目前占 78%。专家们注意到利用漏洞的大规模攻击和大量用户个人数据的泄露。此外,在此期间࿰…...
clickhouse的另类表引擎
clickhouse常用的MergeTree引擎外,还有特殊的引擎 1,memory引擎,顾名思义,数据是存储在内存中,数据不会被压缩也不会倍格式化转换数据在内存中保存的形态与查询时看到的如出一辙,重启ck数据丢失 2ÿ…...
Uniapp新版本打包后覆盖安装,新增的页面无法跳转,需退出重新启动才可以打开的解决方案
最近写uniapp项目,发现一个坑,在新版本覆盖安装后直接打开APP,新增的页面竟然无法跳转,需要重新启动才可以正常打开,在网上查了很多方法,最终总结下来有以下几点: 1.看打的是debug包还是releas…...
系统架构设计高级技能 · 面向服务架构设计理论与实践
点击进入系列文章目录 系统架构设计高级技能 面向服务架构设计理论与实践 一、SOA的相关概念1.1SOA的定义1.2 业务流程与业务流程执行语言 二、SOA的发展史三、SOA与微服务的区别三、SOA的参考架构四、SOA的主要协议规范五、SOA的设计标准要求六、SOA的作用与设计原则七、SOA的…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
