Opencv threshold函数、adaptiveThreshold函数详解和示例
创始人
2024-11-15 14:06:28
0

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. 小于等于阈值,取原值

公式:

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

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

参考:【opencv学习笔记】015之基本阈值操作_最大阈值和最小阈值公式-CSDN博客 

1.6 代码示例 

#include   #include   #include    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:从平均值或者加权平均值中减去的常数,可以为正,也可以为负。

第一种ADAPTIVE_THRESH_MEAN_C,针对像素(x,y)的计算方式如下:

        T(x,y)结果是在(x,y)的邻域blockSize×blockSize范围内所有灰度值的均值减去第7个参数double C;

第二种ADAPTIVE_THRESH_GAUSSIAN_C,针对像素(x,y)的计算方式如下:

  • 首先,生成一个大小为blockSize×blockSize的高斯核,作为权重;
  • 其次,利用高斯核与(x,y)邻域范围内灰度值,进行加权求和,再减去减去第7个参数double C,得到T(x,y);

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

#include   #include   #include     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  =" <

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

 

 

adaptiveThreshold函数可参考: OpenCV-C++ 图像自适应阈值二值化处理adaptiveThreshold - chenzhen0530 - 博客园 (cnblogs.com)

相关内容

热门资讯

ia攻略/牛牛房卡代理九酷大厅... 今 日消息,九酷大厅/随意玩房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更...
我来教你/金花房卡专卖店新超圣... 新超圣房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根据...
正规平台有哪些,牛牛房卡怎么获... 微信游戏中心:青鸟大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
一分钟实测分享”热玩吧房卡怎么... 一分钟实测分享”热玩吧房卡怎么弄“牛牛房卡哪里有卖游戏中心打开微信,添加客服【113857776】,...
一分钟了解“如何购买金花房卡普... 悠悠大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡...
IA解析/斗牛房卡充值天道联盟... IA解析/斗牛房卡充值天道联盟/随意玩/房卡怎么买Sa9Ix苹果iPhone 17手机即将进入量产阶...
我来教你/牛牛充值房卡新竹大厅... 今 日消息,新竹大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
玩家攻略”王者大厅房卡“牛牛房... 玩家攻略”王者大厅房卡“牛牛房卡哪里有卖 微信牛牛房卡客服微信号微信游戏中心打开微信,添加客服【11...
推荐一款!牛牛房卡代理天蝎大厅... 微信游戏中心:天蝎大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
重大通报,金花充值房卡星驰娱乐... 星驰娱乐是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
科技实测!金花房卡出售新二号/... 您好!微信新二号大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(新二号)大厅介绍:咨询...
终于找到“微信斗牛房卡如何购买... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
重大通报,金花房卡是正规的新道... 今 日消息,新道游/新皇豪房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新...
一秒了解”百万牛房卡获取“哪里... 房卡获取是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:113857776许多玩家在游戏中会购买房卡...
我来教你/斗牛房间怎么创建的南... 南瓜大厅/新道游房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 ...
重大通报,牛牛房卡制作链接新众... 微信游戏中心:新众亿/皇豪互娱房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或...
ia实测“微信链接斗牛房卡多少... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享受...
正版授权!金花房卡专卖店鲨鱼众... 您好!微信鲨鱼众娱大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(鲨鱼众娱)大厅介绍:...
实测分享”辣椒互娱房卡详细充值... 实测分享”辣椒互娱房卡详细充值“牛牛房卡批发平台游戏中心打开微信,添加客服【113857776】,进...
IA解析/牛牛房卡怎么获得天酷... 天酷大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...