📜  OpenCV:使用阈值进行细分

📅  最后修改于: 2021-05-30 13:33:59             🧑  作者: Mango

在本文中,一种用于对象分割的基本技术称为Thresholding
但是,在进一步详细介绍之前,下面是OpenCV的简要概述。

OpenCV (开源计算机视觉)是一个跨平台的,具有编程功能的开源库,旨在在广泛的领域中执行实时计算机视觉任务,例如:

  • 面部识别
  • 虹膜识别系统
  • 手势识别
  • 人机交互(HCI)
  • 移动机器人
  • 对象识别
  • 细分与识别
  • 立体视立体视觉:2台摄像机的深度感知
  • 增强现实

它还包括一个强大的统计机器学习库,该库包含许多用于支持上述领域的不同分类器。

要使用OpenCV,只需导入或包含所需的库,然后开始使用无数可用功能。

阈值处理是一种非常流行的分割技术,用于将对象与背景分离。在下面的文章中,我描述了用于阈值灰度图像(8位)的各种技术。

阈值处理涉及将图像的每个像素值(像素强度)与指定的阈值进行比较。这会将输入图像的所有像素分为2组:

  1. 强度值低于阈值的像素。
  2. 强度值大于阈值的像素。

现在,根据不同的细分类型,为这两个组赋予不同的值。
OpenCV使用以下函数在灰度(8位)图像上支持5种不同的阈值方案:

双阈值(InputArray src,OutputArray dst,双阈值,双maxval,int类型)

参数:

  • InputArray src:输入图像(Mat,8位或32位)
  • OutputArray dst:输出图像(与输入大小相同)
  • 两次脱粒:设置阈值
  • double maxval:maxVal,在类型1和2中使用
  • int type *:指定要使用的阈值类型。 (0-4)

    *在下面的阈值类型列表中。

    输入图像

    原始

    在完成阈值处理之前,首先将输入的RGB图像转换为灰度图像。

    体重

    阈值类型

    • 二进制阈值(整数类型= 0)

      0_130
      在较早获得的两个组中,具有像素强度大于设置的阈值的成员的组被分配“ Max_Value”,或者在灰度的情况下,值为255(白色)。
      其余组的成员的像素强度设置为0(黑色)。

      eq1

      如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中的像素强度值将设置为“ maxVal”。

    • 反向二进制阈值(整数类型= 1)

      1_130

      Inv。二进制阈值与二进制阈值相同。唯一的本质区别是,在Inv.Binary阈值处理中,像素强度大于设置的阈值的组被分配为“ 0”,而强度小于阈值的其余像素被设置为“ maxVal”。

      eq2

      如果源图像中(x,y)处的像素强度值大于阈值,则将最终图像中的像素强度值设置为“ 0”,否则将其设置为“ maxVal”。

    • 截断阈值(int类型= 2)

      2_150

      具有大于设置阈值的像素强度的组被截断为设置阈值,或者换句话说,将像素值设置为与设置阈值相同。
      所有其他值保持不变。

      eq3

      如果源图像中(x,y)处的像素强度值大于阈值,则将最终图像中的值设置为“阈值”,否则保持不变。

    • 阈值为零(整数类型= 3)

      3

      一种非常简单的阈值化技术,其中对于像素强度值小于该阈值的组中的所有像素,我们将像素强度设置为“ 0”。

      eq4

      如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中(x,y)处的像素强度值不会改变。所有其余像素均设置为“ 0”。

    • 阈值为零,反转(int type = 4)

      4

      与先前的技术相似,对于像素强度值大于阈值的组中的所有像素,此处我们将像素强度设置为“ 0”。

      eq5

      如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中(x,y)处的像素强度值将设置为’0’。所有剩余的像素值均保持不变。


    要编译OpenCV程序,您需要在系统上安装OpenCV库。我将在未来几天内发布相同的简单教程。
    如果您已经安装了OpenCV,请使用您选择的输入图像运行以下代码。

    // CPP program to demonstrate segmentation
    // thresholding.
    #include 
    #include 
    #include 
    #include 
      
    using namespace cv;
      
    int main(int argc, char** argv)
    {
        if (argc != 2) 
        {
            cout << " Usage: "
                    " " << endl;
            return -1;
        }
      
        int threshold_value = 0;
      
        // Valid Values: 0, 1, 2, 3, 4
        int threshold_type = 2; 
      
        // maxVal, useful for threshold_type 1 and 2
        int maxVal = 255; 
      
        // Source image
        Mat src = imread(argv[1], 1);
      
        cvNamedWindow("Original", CV_WINDOW_NORMAL);
        imshow("Original", src);
      
        Mat src_gray, dst;
      
        // Convert the image to GrayScale
        cvtColor(src, src_gray, CV_BGR2GRAY);
      
        // Create a window to display results
        cvNamedWindow("Result", CV_WINDOW_NORMAL);
      
        createTrackbar("Threshold", "Result", 
                      &threshold_value, 255);
        while (1) 
        {
            threshold(src_gray, dst, threshold_value, 
                             maxVal, threshold_type);
            imshow("Result", dst);
            waitKey(1);
        }
    }
    
    要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”