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_BINARYTHRESH_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);
}

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

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

相关文章

容器权限降级为 op 用户

容器权限降级为 op 用户 更新 Docker Compose 配置文件&#xff1a; 请确保已提供的 docker-compose.yml 文件已准备好&#xff0c;并覆盖了原先的配置文件。 cd /home/op/compose设置文件和文件夹权限&#xff1a; 在 Linux 环境中&#xff0c;按照以下步骤逐一执行命令。在需…

socket,tcp,http三者之间的原理和区别

目录 1、TCP/IP连接 2、HTTP连接 3、SOCKET原理 4、SOCKET连接与TCP/IP连接 5、Socket连接与HTTP连接 socket&#xff0c;tcp&#xff0c;http三者之间的区别和原理 http、TCP/IP协议与socket之间的区别 下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程&#xff08;Backpressure Thread&#xff09;&#xff0c;这个线程一但检测到 Bolt 里的接收队列&#xff08;recv queue&#xff09;出现了…

软件测试/测试开发丨文件上传与弹窗处理 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27071 一、文件上传 input标签可以直接使用send_keys(“文件路径/文件名”)上传文件 ele01 driver.find_element(By.ID,“上传按钮id”)ele01.send_keys(…

Java异常(Error与Exception)与常见异常处理——第八讲

前言 前面我们讲解了Java的基础语法以及面向对象的思想,相信大家已经基本掌握了Java的基本编程。在之前代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的…

敲笨钟ptaC++

substr string a "123456"; string sub_a a.substr(0, 2); // "12"string sub_a_ a.substr(2); // "3456"左闭右开的截取字符串 实现思路 以逗号分割&#xff0c;取出两个字符串。利用substr判断是否以ong结尾&#xff0c;然后使用string流…

(一)连续随机量的生成-从t分布采样

连续随机量的生成-从t分布采样 1. t t t 分布2. 从 t t t 分布采样3. Python编程实现 1. t t t 分布 t t t 分布作为 t t t 检验的抽样分布出现。 令 z 1 , ⋯ , z n z_1, \cdots, z_n z1​,⋯,zn​ 为 i.i.d&#xff0c;分布为 N ( μ , σ 2 ) N\left(\mu, \sigma^2\rig…

简单了解ICMP协议

目录 一、什么是ICMP协议&#xff1f; 二、ICMP如何工作&#xff1f; 三、ICMP报文格式 四、ICMP的作用 五、ICMP的典型应用 5.1 Ping程序 5.2 Tracert(Traceroute)路径追踪程序 一、什么是ICMP协议&#xff1f; ICMP因特网控制报文协议是一个差错报告机制&#xff0c;…

实力认证!OceanBase获“鼎信杯”优秀技术支撑奖

6 月 30 日&#xff0c;2023 “鼎信杯”信息技术发展论坛在京隆重举办第二届“鼎信杯”大赛颁奖典礼。OceanBase 凭借完全自主研发的原生分布式数据库&#xff0c;以及丰富的核心系统国产数据库升级案例&#xff0c;斩获“优秀技术支撑奖”。 论坛上&#xff0c;国内首个基于在…

ThreeJS 模型中内嵌文字

之前有过模型中内嵌html网页&#xff0c;地址☞threeJS 模型中加载html页面_threejs 加载dom元素_小菜花29的博客-CSDN博客 这次是纯粹的在模型中嵌入文本信息&#xff0c;进行简单的文字展示 展示效果图 1. 使用FontLoader文字加载器 引入文本json文件&#xff0c;代码如下…

数据结构(Java实现)-排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff…

2022年下半年系统架构设计师真题(下午带答案)

试题一 (25分) 某电子商务公司拟升级其会员与促销管理系统&#xff0c;向用户提供个性化服务&#xff0c;提高用户的粘性。在项目立项之初&#xff0c;公司领导层一致认为本次升级的主要目标是提升会员管理方式的灵活性&#xff0c;由于当前用户规模不大&#xff0c;业务也相对…

#systemverilog# 之 event region 和 timeslot 仿真调度(七)Active/NBA 咋跳转的?

目录 一 目的 二 案例分析 2.1 先Active域,后 NBA 域 2.2 先Active域,后 NBA 域,后NBA域

数据结构(Java实现)-Map和Set

搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值 它的左右子树也…

快速上手GIT命令,现学也能登堂入室

系列文章目录 手把手教你安装Git&#xff0c;萌新迈向专业的必备一步 GIT命令只会抄却不理解&#xff1f;看完原理才能事半功倍&#xff01; 快速上手GIT命令&#xff0c;现学也能登堂入室 系列文章目录一、GIT HELP1. 命令文档2. 简要说明 二、配置1. 配置列表2. 增删改查3. …

python自动化测试-自动化基本技术原理

1 概述 在之前的文章里面提到过&#xff1a;做自动化的首要本领就是要会 透过现象看本质 &#xff0c;落实到实际的IT工作中就是 透过界面看数据。 掌握上面的这样的本领可不是容易的事情&#xff0c;必须要有扎实的计算机理论基础&#xff0c;才能看到深层次的本质东西。 …

【C++深入浅出】类和对象上篇(类的基础、类的模型以及this指针)

目录 一. 前言 二. 面向对象与面向过程 2.1 面向过程 2.2 面向对象 三. 类的基础知识 3.1 类的引入 3.2 类的定义 3.3 成员变量的命名规则 3.4 封装 3.5 类的访问限定符 3.6 类的作用域 3.7 类的实例化 四. 类的对象模型 4.1 类对象的大小 4.2 类对象的存储方式 …

从Matrix-ResourceCanary看内存快照生成-ForkAnalyseProcessor(2)

不同于LeakCanary,在Matrix中,主要是通过Resource Canary来监控内存泄漏问题的,且监听的泄漏对象只支持Activity,官方说明如下: 结合分析LeakCanary的经验可知,要实现Activity内存泄漏监听,总体上应该要实现两大功能: Activity生命周期监控查找泄漏对象并得到GC Root P…

LeetCode-45-跳跃游戏Ⅱ-贪心算法

题目描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到…

剑指 Offer 10- II. 青蛙跳台阶问题

剑指 Offer 10- II. 青蛙跳台阶问题 和 剑指 Offer 10- I. 斐波那契数列 很像&#xff0c;改一下初始值就行了。 方法一 class Solution {int mod (int) 1e9 7;public int numWays(int n) {if(n < 1) return 1;int[] dp new int[n 1];dp[1] 1;dp[2] 2;for(int i 3…