美文网首页
OpenCV:十二、图像基本阈值操作

OpenCV:十二、图像基本阈值操作

作者: 马洪滔 | 来源:发表于2020-12-28 11:09 被阅读0次

    前言

    在上一章中描述了如何进行图像上采样和降采样,详细描述可点击查看(https://www.jianshu.com/writer#/notebooks/47386368/notes/78352031)

    目标

    本章中,将学习:

    • 图像阈值
    • 阈值类型
    • 代码演示

    图像阈值(Threshold)

    • 阈值是什么?简单点说是把图像分割的标尺,这个标尺是根据什么产生的,阈值产生算法?阈值类型。(Binary segmentation)

    阈值类型

    • 阈值类型--阈值二值化(threshold binary)
      左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。


      阈值二值化.png
    • 阈值类型--阈值反二值化(threshold binary interved)
      左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。


      阈值反二值化.png
    • 阈值类型--截断(truncate)
      左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。


      截断 .png
    • 阈值类型--阈值取零(threshold to zero)
      左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。


      阈值取零.png
    • 阈值类型--阈值反取零(threshold to zero inverted)
      左下方的图表示图像像素点Src(x,y)值分布情况,蓝色水平线表示阈值。


      阈值反取零.png

    threshold()函数原型如下:

    double cv::threshold  ( InputArray  src,  
      OutputArray  dst,  
      double  thresh,  
      double  maxval,  
      int  type  
     ) 
    

    参数解释:
    . InputArray src: 输入图像,可以是Mat类型,图像必须为单通道8位或32位浮点型图像
    . OutputArray dst: 输出图像,与输入图像尺寸和类型相同
    . double thresh: 设定的阈值
    . double maxval: 使用THRESH_BINARY和THRESH_BINARY_INV类型的最大值
    . int type: 阈值化类型,可以通过ThresholdTypes查看,下面给出opencv中五种阈值化类型及其对应公式:


    阈值化类型.png

    代码演示

    /*
     *程序通过创建trackbar来控制阈值化类型
     *通过调节trackbar来调节
     *其具体阈值化类型如下:
     *0: THRESH_BINARY 二进制阈值化
     *1: THRESH_BINARY_INV 反二进制阈值化
     *2: THRESH_TRUNC 截断阈值化
     *3: THRESH_TOZERO 阈值化为0
     *4: THRESH_TOZERO_INV 反阈值化为0
    */
    
    #include <iostream>
    #include <opencv2/core.hpp>
    #include <opencv2/highgui.hpp>
    #include <opencv2/imgproc.hpp>
    
    using namespace std;
    using namespace cv;
    
    //定义全局变量
    Mat g_srcImage, g_srcGrayImage, g_dstImage;
    
    const int typeMaxValue = 4;
    int typeValue = 0;
    const int binaryMaxValue = 255;
    
    const int thresholdMaxValue = 255;      //阈值的最大值
    int thresholdValue = 0;     //阈值的初始值
    
    //定义回调函数
    void thresholdFun(int, void*);
    
    int main()
    {
        g_srcImage = imread("lena.jpg");
    
        //判断图像是否加载成功
        if(g_srcImage.empty())
        {
            cout << "图像记载失败!" << endl;
            return -1;
        }
        else
            cout << "图像加载成功!" << endl << endl;
    
        cvtColor(g_srcImage, g_srcGrayImage, COLOR_RGB2GRAY);   //将图像转化为灰度图
    
        //创建轨迹条及其依附窗口
        namedWindow("图像阈值化处理", WINDOW_AUTOSIZE);
    
        char threasholdTypeName[20];
        sprintf(threasholdTypeName, "阈值化类型 %d", typeMaxValue);
        createTrackbar(threasholdTypeName, "图像阈值化处理", &typeValue, typeMaxValue, thresholdFun);
        thresholdFun(typeValue, 0);
    
        char thresholdValueName[20];
        sprintf(thresholdValueName, "阈   值 %", thresholdMaxValue);
        createTrackbar(thresholdValueName, "图像阈值化处理", &thresholdValue, thresholdMaxValue, thresholdFun);
        thresholdFun(thresholdValue, 0);
    
        waitKey(0);
    
        return 0;
    }
    
    //回调函数
    void thresholdFun(int, void*)
    {
        int thresholdType;
        switch(typeValue)
        {
        case 0:
            thresholdType = THRESH_BINARY;
            break;
        case 1:
            thresholdType = THRESH_BINARY_INV;
            break;
        case 2:
            thresholdType = THRESH_TRUNC;
            break;
        case 3:
            thresholdType = THRESH_TOZERO;
            break;
        case 4:
            thresholdType = THRESH_TOZERO_INV;
            break;
        default:
            break;
        }
    
        //图像阈值化处理
        threshold(g_srcGrayImage, g_dstImage, thresholdValue, binaryMaxValue, thresholdType);   
    
        imshow("图像阈值化处理", g_dstImage);
    }
    
    效果图.png

    相关文章

      网友评论

          本文标题:OpenCV:十二、图像基本阈值操作

          本文链接:https://www.haomeiwen.com/subject/kioknktx.html