当前位置: 首页 > news >正文

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

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); //灰度图像大津法和三角形法二值化// Mat img_Thr = imread("../pic/hand.jpg", IMREAD_GRAYSCALE); // Mat img_Thr = imread("../pic/hand.jpg"); // 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, 55, 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; 
}

结果:

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【力扣】SQL题库练习5
  • actual combat 38 ——vue
  • 【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据
  • 零基础学python 之 第十九讲 正则表达式
  • Express基于Node.js基础知识【2】全面总结 推荐
  • C++必修:STL之vector的了解与使用
  • JavaScript 变量声明var、let、const
  • 实验2-5-7 求阶乘序列前N项和【多看看函数】
  • 文件夹判断操作类 - C#小函数类推荐
  • 哈夫曼树及哈夫曼编码
  • 前端小白安装node、vue、Express、Electron及(Electron桌面端exe应用开发)
  • 干货满满,从零到一:编程小白如何在大学成为编程大神?
  • 滴滴官宣潘展乐为滴滴网约车“快”乐大使
  • AI产品经理的职责与能力:将AI技术转化为实际价值
  • 算法小白的进阶之路(力扣1~5)
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • 3.7、@ResponseBody 和 @RestController
  • Consul Config 使用Git做版本控制的实现
  • Date型的使用
  • Java,console输出实时的转向GUI textbox
  • Just for fun——迅速写完快速排序
  • Laravel 实践之路: 数据库迁移与数据填充
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Phpstorm怎样批量删除空行?
  • supervisor 永不挂掉的进程 安装以及使用
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 给第三方使用接口的 URL 签名实现
  • 回顾2016
  • 前端js -- this指向总结。
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 原生Ajax
  • k8s使用glusterfs实现动态持久化存储
  • 说说我为什么看好Spring Cloud Alibaba
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​queue --- 一个同步的队列类​
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #define用法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (27)4.8 习题课
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (十八)三元表达式和列表解析
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五)关系数据库标准语言SQL
  • (转)nsfocus-绿盟科技笔试题目
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET CORE Aws S3 使用
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作