图像二值化

目录

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.rhkb.cn/news/112455.html

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

相关文章

c语言实现二叉树(链式结构)

文章目录 前言一、二叉树的遍历1、二叉树的层序遍历2、二叉树的前序遍历3、二叉树的中序遍历4、二叉树的后序遍历5、代码实现 二、二叉树的一些操作的实现1、求二叉树的结点个数2、求二叉树叶子结点个数3、求二叉树第k层结点个数4、求二叉树深度5、二叉树中查找值为x的结点6、二…

streamlit-高级功能

缓存 st.cache_data st.cache_resource 为应用程序添加会话状态 会话状态 会话状态应用到应用程序 会话状态和小部件关联 可序列化会话状态 注意事项和限制 命令行选项 应用程序菜单 菜单选项 开发者选项 streamlit配置 按钮行为和示例 连接到数据 数据框 形式 小部件语义 …

前端vue引入高德地图入门教程

距离上一篇关于前端项目中使用高德地图的文章已经将近5年之久&#xff0c; 这是我的第一篇关于高德地图的文章 这期间前端技术日新月异&#xff0c;5年前JQuery还如日中天&#xff0c;如今已经销声匿迹&#xff0c;很少有公司招聘还在要求JQuery&#xff0c;更多的是Vue、React…

keras深度学习框架构建LeNet5神经网络模型实现手写数字识别

之前两篇文章分别通过keras深度学习框架构建简单神经网络和卷积神经网络实现过手写数字识别实验。这篇文章分享我根据LeNet5模型构建的卷积神经网络来实现手写数字识别。 这个实验是根据LeNet5模型构建卷积神经网络&#xff0c;LeNet5模型的原理图如下所示&#xff1a; 相信大家…

中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索

作者&#xff1a;张政俊 中欧财富数据库负责人 中欧财富是中欧基金控股的销售子公司&#xff0c;旗下 APP 实现业内基金品种全覆盖&#xff0c;提供基金交易、大数据选基、智慧定投、理财师咨询等投资工具及服务。中欧财富致力为投资者及合作伙伴提供一站式互联网财富管理解决方…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

论文笔记: One Fits All:Power General Time Series Analysis by Pretrained LM

1 intro 时间序列领域预训练模型/foundation 模型的研究还不是很多 主要挑战是缺乏大量的数据来训练用于时间序列分析的基础模型——>论文利用预训练的语言模型进行通用的时间序列分析 为各种时间序列任务提供了一个统一的框架 论文还调查了为什么从语言领域预训练的Transf…

【ag-grid-vue】column

网格中的每一列都使用列定义(ColDef)来定义。列根据在网格选项中指定的列定义的顺序在网格中定位。 列定义 下面的例子展示了一个定义了3列的简单网格: <template><ag-grid-vuestyle"height: 300px; width: 1000px"class"ag-theme-balham":colum…

get√接口自动化核心知识点浓缩,为面试加分

日常接触到的接口自动化从实际目标可以划分为两大类&#xff1a; 1、为模拟测试数据而开展的接口自动化 这种接口自动化大多是单次执行&#xff0c;目的很明确是为了功能测试创造测试数据&#xff0c;节约人工造数据的时间和人工成本&#xff0c;提高功能测试人员的测试效率。…

chain of thought (思维链, cot)

定义 思维链 (Chain-of-thought&#xff0c;CoT) 的概念是在 Google 的论文 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 中被首次提出。思维链&#xff08;CoT&#xff09;是一种改进的提示策略&#xff0c;用于提高 LLM 在复杂推理…

【UE5】给模型指定面添加自定义材质

实现步骤 1. 首先我们向UE中导入一个简单的模型&#xff0c;可以看到目前该模型的材质插槽只有一个&#xff0c;当我们修改材质时会使得模型整体的材质全部改变&#xff0c;如果我们只想改变模型的某些面的材质就需要继续做后续操作。 2. 选择建模模式 3. 在模式工具栏中点击…

Linux学习之Ubuntu 20使用systemd管理OpenResty服务

sudo cat /etc/issue可以看到操作系统的版本是Ubuntu 20.04.4 LTS&#xff0c;sudo lsb_release -r可以看到版本是20.04&#xff0c;sudo uname -r可以看到内核版本是5.5.19&#xff0c;sudo make -v可以看到版本是GNU Make 4.2.1。 需要先参考我的博客《Linux学习之Ubuntu 2…

SpringBoot Mybatis 多数据源 MySQL+Oracle

一、背景 在SpringBoot Mybatis 项目中&#xff0c;需要连接 多个数据源&#xff0c;连接多个数据库&#xff0c;需要连接一个MySQL数据库和一个Oracle数据库 二、依赖 pom.xml <dependencies><dependency><groupId>org.springframework.boot</groupId&…

【Golang】go条件编译

交叉编译只是为了能在一个平台上编译出其他平台可运行的程序&#xff0c;Go 作为一个跨平台的语言&#xff0c;它提供的类库势必也是跨平台的&#xff0c;比如说程序的系统调用相关的功能&#xff0c;能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译…

【Linux】centos8安装cmake3.27.4

第一步&#xff0c;去官网下安装包&#xff0c;一定不要下错了 下好了之后&#xff0c;用ftp软件传到云服务器或者虚拟机上&#xff0c;我用的是centos8系统&#xff0c;安装之前先准备好这些依赖项 yum install -y gcc gcc-c make automake yum install -y openssl openssl-…

多线程应用——单例模式

单例模式 文章目录 单例模式一.什么是单例模式二.如何实现1.口头实现2.利用语法特性 三.实现方式&#xff08;饿汉式懒汉式&#xff09;1.饿汉式2.懒汉式3.线程安全的单例模式4.双重检查锁5.禁止指令重排序 一.什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff…

LLM本地知识库问答系统(二):如何正确使用LlamaIndex索引

推荐阅读列表&#xff1a; LLM本地知识库问答系统&#xff08;一&#xff09;&#xff1a;使用LangChain和LlamaIndex从零构建PDF聊天机器人指南 上一篇文章我们介绍了使用LlamaIndex构建PDF聊天机器人&#xff0c;本文将介绍一下LlamaIndex的基本概念和原理。 LlamaIndex简介…

视频分割合并工具说明

使用说明书&#xff1a;视频分割合并工具 欢迎使用视频生成工具&#xff01;本工具旨在帮助您将视频文件按照指定的规则分割并合并&#xff0c;以生成您所需的视频。 本程序还自带提高分辨率1920:1080&#xff0c;以及增加10db声音的功能 软件下载地址 https://github.com/c…

FPGA原理与结构——时钟IP核原理学习

一、前言 在之前的文章中&#xff0c;我们介绍了FPGA的时钟结构 FPGA原理与结构——时钟资源https://blog.csdn.net/apple_53311083/article/details/132307564?spm1001.2014.3001.5502 在本文中我们将学习xilinx系列的FPGA所提供的时钟IP核&#xff0c;来帮助我们进一…

TCP/IP五层模型、封装和分用

1.网络通信基础2.协议分层OSI七层协议模型TCP/IP五层/四层协议模型【重点】 3. 封装&分用 1.网络通信基础 IP地址&#xff1a;表示计算机的位置&#xff0c;分源IP和目标IP&#xff1b;举个例子&#xff1a;买快递&#xff0c;商家从上海发货&#xff0c;上海就是源IP&…