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

    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,就会重新匹配该照片的阈值

 

 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中的threshold函数用于对图像进行阈值分割。阈值分割是将图像像素值分为两个类别的过程,大于或小于给定阈值的像素值将被分配到不同的类别中。函数的语法如下: threshold(src, dst, threshold_value, maxval, type) 其中,src是输入图像,可以是8位的灰度图像或32位的彩色图像。dst是输出图像,thresh是阈值,maxval是dst图像中的最大值,type是阈值类型。 阈值类型有以下几种选项: 1. THRESH_BINARY: 大于阈值的像素值设为maxval,小于等于阈值的像素值设为0。 2. THRESH_BINARY_INV: 大于阈值的像素值设为0,小于等于阈值的像素值设为maxval。 3. THRESH_TRUNC: 大于阈值的像素值设为阈值,小于等于阈值的像素值保持不变。 4. THRESH_TOZERO: 大于阈值的像素值保持不变,小于等于阈值的像素值设为0。 5. THRESH_TOZERO_INV: 大于阈值的像素值设为0,小于等于阈值的像素值保持不变。 在使用函数之前,通常需要对输入图像进行预处理,如转换为灰度图像或进行滤波处理,以提高阈值分割的效果。例如,可以使用cvtColor函数将彩色图像转换为灰度图像,使用medianBlur函数进行中值滤波。 示例代码中还展示了adaptiveThreshold函数的用法。adaptiveThreshold函数可以根据图像局部区域的均值或高斯邻域的加权和来自适应地确定阈值。 请注意,以上引用的内容主要摘自Opencv官方文档和API介绍。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [OpenCV图像阈值:简单阈值、自适应阈值、OTSU、TRIANGLE](https://blog.csdn.net/thequitesunshine007/article/details/107594320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值