Opencv threshold函数、adaptiveThreshold函数详解和示例

news2025/3/9 9:23:09

1.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:选择图像二值化方法的标志。

                                                 二值化方法可选择的标志及含义

标志参数
作用
THRESH_BINARY
灰度值大于阈值的为最大值,其他值为 0
THRESH_BINARY_INV
灰度值大于阈值的为 0 ,其他值为最大值
THRESH_TRUNC
灰度值大于阈值的为阈值,其他值不变
THRESH_TOZERO
灰度值大于阈值的不变,其他值为 0
THRESH_TOZERO_INV
灰度值大于阈值的为 0 ,其他值不变
THRESH_OTSU
大津法自动寻求全局阈值
THRESH_TRIANGLE
三角形法自动寻求全局阈值

为了方便讲解,我们使用如下的一个图像,红色表示图像,黑色是图像的边界,蓝色是阈值

                                

                                                                                原图 

1.1 THRESH_BINARY 

  1. 大于阈值,取最大值。
  2. 小于等于阈值取0。

公式:

对于原图,如果我们进行二值化操作,那么蓝色的线以上的,都变成最大值,蓝色的线以下的线都变成0

                                

1.2 THRESH_BINARY_INV

  1. 大于阈值,取0。
  2. 小于等于阈值,取最大值。

公式:

对于原图,如果我们进行反二值化操作,那么蓝色的线以下的,都变成最大值,蓝色的线以上的线都变成0

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

1.3  THRESH_TRUNC

  1. 大于阈值,取阈值
  2. 小于等于阈值,取原值

​​​​​​​公式:

 对于原图,如果我们进行截断操作

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

1.4 THRESH_TOZERO 

  1. 大于阈值的,取原值。
  2. 小于等于阈值,取0

公式:

对于原图,如果我们进行操作

        ​​​​​​​        ​​​​​​​        ​​​​​​​        

1.5  THRESH_TOZERO_INV

  1. 大于阈值的,取0。
  2. 小于等于阈值,取原值

公式:

 对于原图,如果我们进行操作

        ​​​​​​​        ​​​​​​​        ​​​​​​​         

1.6 代码示例 

#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <vector> 

using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat img = imread("../pic/gril_1.jpg"); 
    if (img.empty()) 
    { 
        cout << "请确认图像文件名称是否正确" << endl; 
        return -1; 
    } 
    imshow("原画", img); 
    Mat gray; 
    double a , b ,c ,d ;
    cvtColor(img, gray, COLOR_BGR2GRAY); 
    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); 

    waitKey(0); 
    return 0; 
}

结果:

 

 

1.7 THRESH_OTSU 和 THRESH_TRIANGLE 

       这两种标志是获取阈值的方法,并不是阈值比较方法的标志,这两个标志可以与前面 5 种标志
一起使用,例如“ THRESH_BINARY| THRESH_OTSU ”。前面 5 种标志在调用函数时都需要人为
地设置阈值,如果对图像不了解,设置的阈值不合理,就会对处理后的效果造成严重的影响。这两
个标志分别表示利用大津法( OTSU )和三角形法( TRIANGLE )结合图像灰度值分布特性获取二
值化的阈值,并将阈值以函数返回值的形式给出(简单来说就是重新自动设置二值化的阈值 )。因此,如果该函数最后一个参数设置了这两个标 志中的任何一个,那么该函数第三个参数 thresh 将由系统自动给出,但是在调用函数时仍然不能默认,只是程序不会使用这个数值。需要注意的是,到目前为止,OpenCV 4 中针对这两个标志只支 持输入 CV_8UC1 类型的图像。
        threshold()函数全局只使用一个阈值,在实际情况中,由于光照不均匀以及阴影的存在,全局
只有一个阈值会使得在阴影处的白色区域也会被函数二值化成黑色,因此 adaptiveThreshold() 函数提供了两种局部自适应阈值的二值化方法。

2.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
邻域内的阈值,之后进行二值化。

2.1代码示例(包含THRESH_OTSU 和 THRESH_TRIANGLE )

#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <vector> 
 
using namespace std; 
using namespace cv; 
 
int main() 
{
    //灰度图像大津法和三角形法二值化
    Mat img_Thr = imread("../pic/gril_2.png", IMREAD_GRAYSCALE); 
    double a ,b ,c,d ;
    if (img_Thr.empty()) 
    { 
        cout << "请确认图像文件名称是否正确" << endl; 
        return -1; 
    } 
    //cvtColor(img_Thr, img_Thr, COLOR_BGR2GRAY); 
    Mat img_Thr_O, img_Thr_O_1,img_Thr_T,img_Thr_T_1; 
    a = threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU); 
    b = threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE); 
    c = threshold(img_Thr, img_Thr_O_1, 150, 255, THRESH_BINARY | THRESH_OTSU); 
    d = threshold(img_Thr, img_Thr_T_1, 200, 255, THRESH_BINARY | THRESH_TRIANGLE); 
    cout << "333  a  =" <<a <<"  b = " << b << endl; 
    cout << "333  c  =" <<c <<"  d = " << d << endl; 

    imshow("img_Thr", img_Thr); 
    imshow("img_Thr_O", img_Thr_O); 
    imshow("img_Thr_T", img_Thr_T); 
    imshow("img_Thr_O_1", img_Thr_O_1); 
    imshow("img_Thr_T_1", img_Thr_T_1); 
 
    //灰度图像自适应二值化
    Mat adaptive_mean, adaptive_gauss; 
    adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 255, 0); 
    adaptiveThreshold(img_Thr, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 55, 0); 
 
    imshow("adaptive_mean", adaptive_mean); 
    imshow("adaptive_gauss", adaptive_gauss); 
 
    waitKey(0); 
    return 0; 
}

结果:threshold函数不管设置的阈值是多少,只要有THRESH_OTSU 和 THRESH_TRIANGLE,就会重新匹配该照片的阈值

 

 

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

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

相关文章

全球汽车橡胶减震支架市场规划预测:未来六年CAGR为2.5%

随着汽车行业的持续发展和消费者对驾驶舒适性的需求增加&#xff0c;汽车橡胶减震支架作为提升车辆稳定性和乘坐舒适性的关键组件&#xff0c;正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车橡胶减震支架行业的各个维度&#xff0c;揭示行业发展趋势和潜在机会。 【市场…

反序列化靶机serial漏洞复现 超详细教程

环境搭建 漏洞环境&#xff1a;https://www.vulnhub.com/entry/serial-1,349/ 下载后使用Vmware打开 创建新的虚拟机&#xff1a; 选择客户机版本为Ubuntu 64位&#xff1a; 一直下一步&#xff0c;知道选择使用现有磁盘&#xff1a; 选择下载的vmdk磁盘文件&#xff1a; 开机…

生信技能55 - WisecondorX分析结果过滤和质控

WisecondorX分析CNV,对每条染色的CNV loss和gain进行分组,对每个组求ratio平均值和zscore平均值,基于该数值对CNV进行质控和过滤,并对连续的CNV进行合并,获得可信的CNV。 WisecondorX基本使用方法以及npz文件转换和reference构建参考文章: 生信技能53 - wiseconrdoX自动…

利用扩散模型的反馈优化图片理解模型

利用扩散模型的反馈优化图片理解模型 自从 DDPM 以来&#xff0c;扩散模型已经成为了绝对主流的图片生成模型。最近&#xff0c;有研究者开始探索如何将扩散模型的生成能力用于提升判别模型的能力。主要有三种用法&#xff1a;生成模型反演用作判别模型、生成模型用于数据增强…

案例分享—国外优秀UI设计作品

国外 UI设计作品之所以出色&#xff0c;首先在于它们对用户体验的极致追求。设计师们深入了解用户需求&#xff0c;通过细腻的界面布局、直观的交互逻辑和丰富的视觉元素&#xff0c;打造出让用户爱不释手的作品。同时&#xff0c;他们勇于创新&#xff0c;不断尝试新的设计理念…

说说你们出来打工转了几个行业?

先说说我吧&#xff0c;大学毕业出来就从事智能交通刷卡方面&#xff0c;后来又从事多年的自动化控制&#xff0c;接着又做智能停车系统&#xff0c;接着又做医疗&#xff0c;美容仪器&#xff0c;仪器仪表&#xff0c;开关电源……做的有点杂&#xff0c;你们呢&#xff1f;一…

旧版本的Oracle OCM证书怎么升级到最新版本?

一、先来说一下OCM认证&#xff0c;全称是&#xff1a;Oracle Certified Master - Oracle认证大师&#xff0c;是Oracle数据管理员的最高级别的认证。 有了OCM证书&#xff0c;可以证明你的专业能力&#xff0c;是 Oracle 数据库管理方面具备高级和全面技能的权威认证。在竞争…

好用的抠图小技巧

在ps里的抠图方法 方法一&#xff1a;直接在菜单栏里选择主体&#xff0c;选中主体后会出现蚂蚁线&#xff0c;这个时候可能选区还不够完整&#xff0c;需要借助快速选择工具细化选取&#xff0c;选好之后按ctrlj复制选区就抠好啦 方法二&#xff1a;用快速选择工具直接选取人…

jdk环境、tomcat环境

回顾复习 安装nodejs&#xff0c;和jdk一样的软件运行环境 yum -y list installed|grep epel #是否安装epel yum -y install nodejs node -v #查看版本号 下载对应的nodejs软件npm yum -y install npm npm -v #查 npm set config ....淘宝镜像 安装vue/cli…

PatchCore:工业异常检测中的全面召回

PatchCore&#xff1a;工业异常检测中的全面召回 前言相关介绍PatchCore的工作原理&#xff1a;优点&#xff1a;缺点&#xff1a; 实验环境项目地址LinuxWindows 项目结构具体用法准备数据进行训练进行测试 常见问题ModuleNotFoundError: No module named patchcore解决方法 O…

【项目实战】—— 高并发内存池

文章目录 什么是高并发内存池&#xff1f;项目介绍一、项目背景二、项目目标三、核心组件四、关键技术五、应用场景六、项目优势 什么是高并发内存池&#xff1f; 高并发内存池是一种专门设计用于高并发环境下的内存管理机制。它的原型是Google的一个开源项目tcmalloc&#xff…

数字化转型中的安全挑战:源代码加密与文档加密的重要性

深信达SDC防泄密系统在源代码加密和文档加密领域的表现能力非常出色。根据搜索结果&#xff0c;SDC沙盒防泄密系统是专门针对敏感数据防泄密的保护系统&#xff0c;尤其适用于研发型企业的数据保护。系统通过实现对数据的代码级保护&#xff0c;不影响工作效率和正常使用&#…

实现Obsidian PC端和手机端(安卓)同步

步骤 1&#xff1a;在PC端设置Obsidian 安装Obsidian和Git&#xff1a;确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库&#xff1a;在PC上打开命令行&#xff08;例如Windows的命令提示符或Mac/Linux的终端&#xff09;&a…

4.4、文件管理

文件结构 计算机系统中采用的索引文件结构如下图所示: 系统中有13个索引节点,0-9为直接索引,即每个索引节点存放的是内容,假设每个物理盘大小为4KB,共可存4KB * 1040KB数据; 10号索引节点为一级间接索引节点,大小为4KB,存放的并非直接数据,而是链接到直接物理盘块的地址,假设每…

利用 PhysicsConstraint 实现开门效果

先到 Sketchfab 中下载一个门的 3D Model&#xff0c;Popular 3D models - Sketchfab 下载完毕后解压导入到 UE5 中&#xff0c;注意这里需要导入 Static Mesh&#xff1b; 然后将贴图配置到材质 Door Material 中&#xff1b; 处理完毕后&#xff0c;配置使用 Modeling Tools …

【区块链+绿色低碳】山东邹平:区块链生态环境监管平台 | FISCO BCOS应用案例

山东省滨州市生态环境局邹平分局通过实地考察和调研发现&#xff0c;执法大队在执法工作中存在各排污企业设备系统无 法互通、终端采集数据固证难且可信度低、环境执法电子证据采集规则与司法采信标准不统一等痛点。而区块链 的分布式记账、不易篡改性和智能合约自动执行机制&a…

【无标题】vue2鼠标悬停(hover)时切换图片

在Vue 2中&#xff0c;要实现鼠标悬停&#xff08;hover&#xff09;时切换图片的功能&#xff0c;你不能直接在模板的:src绑定中处理这个逻辑&#xff0c;因为Vue的模板不支持条件渲染的复杂逻辑&#xff08;如基于鼠标状态的动态图片切换&#xff09;。但是&#xff0c;你可以…

图新说产品入门指南(让汇报变得轻松)

1.图新说是什么&#xff1f; 图新说是一个容器&#xff1a;可以加载融合各种无人机航测成果&#xff08;影像、地形倾斜模型&#xff09;、基础地理信息数据&#xff08;卫星影像、道路标注、水系、地质图、等高线、地形晕渲、人口等专题地图&#xff09;、业务数据&#xff0…

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(上)

电子表格软件Excel 2016 6.1 Excel 2016入门6.1.1 Excel 2016 简介6.1.2 Excel 2016 的操作界面组成6.1.3 Excel 2016 的视图方式6.1.4 Excel 2016 的工作簿及其操作6.1.5 Excel 2016 的工作表及其操作6.1.5 Excel 2016 的工作表及其操作6.1.6 Excel 2016 的单元格及其操作 6.2…

在欧拉系统中安装数据库

在欧拉系统中的安装 &#xff08;禁止超级用户root登录&#xff09; yum install mariadb-server -y #下载命令 systemctl enable --now mariadb #设置为开机自启&#xff0c;并立即启动该服务 mysql_secure_installation #安全设置&#xff0c;初始化 修…