• OpenCV adaptiveThreshold(自适应阈值)


    1 void adaptiveThreshold(InputArray src, 
    2     OutputArray dst,
    3     double maxValue, 
    4     int adaptiveMethod,
    5     int thresholdType, 
    6     int blockSize, 
    7     double C);

    函数功能

    对一幅灰度图像进行二值化,该函数支持就地操作,该函数用下面的公式对一幅灰度图像进行二值化:

    (1)正向二值化,THRESH_BINARY

     
     

    (2)反向二值化,THRESH_BINARY_INV

     
    • 第一个参数,InputArray src,原图,即输入图像,是一个8位单通道的图像;

    • 第二个参数,OutputArray dst,目标图像,与原图像具有同样的尺寸与类型;

    • 第三个参数,double maxValue,分配给满足条件的像素的非零值;

    • 第四个参数,int adaptiveMethod,自适应阈值的方法,通常有以下几种方法;

      • ADAPTIVE_THRESH_MEAN_C,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的平均值。
      • ADAPTIVE_THRESH_GAUSSIAN_C ,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的加权和(与高斯相关),默认sigma(标准差)用于指定的Blocksize;具体的情况可以参见getGaussianKernel函数;
    • 第五个参数,int thresholdType,阈值的类型必须是以下两种类型,
      • THRESH_BINARY,正向二值化
      • THRESH_BINARY_INV ,反向二值化
    • 第六个参数,int blockSize,计算blocksize x blocksize大小的领域内的阈值,必须为奇数,例如,3,5,7等等,一般二值化使用21,31,41;

    • 第七个参数,double C,从平均数或加权平均数减去常量。通常,它是正的,但也可能是零或负数。,二值化时使用的7。

    阈值类型详解

    (1)THRESH_BINARY

    正向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为maxval;否则,将该点的像素值设置为0;具体的公式如下

     

    (2)THRESH_BINARY_INV

    反向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值设置为maxval,具体的公式如下

     

    (3)THRESH_TRUNC

    如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为threshold;否则,将该点的像素值不变,具体的公式如下

     

    (4)THRESH_TOZERO 

    如果当前的像素值大于设置的阈值(thresh),则将该点的像素值不变;否则,将该点的像素值设置为0,具体的公式如下

     

    (5)THRESH_TOZERO_INV

    如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值不变,具体的公式如下

    (6)THRESH_MASK

    (7)THRESH_OTSU,使用Otsu算法选择最佳阈值。

    (8)THRESH_TRIANGLE,使用三角算法选择最佳阈值。

    补充

    1、函数cvAdaptiveThreshold的确可以将灰度图像二值化,但它的主要功能应该是边缘提取,并且参数param1主要是用来控制边缘的类型和粗细的1
    关键是里面的block_size参数,该参数是决定局部阈值的block的大小,
    1)当block很小时,如block_size=3 or 5 or 7时,“自适应”的程度很高,即容易出现block里面的像素值都差不多,这样便无法二值化,而只能在边缘等梯度大的地方实现二值化,结果显得它是边缘提取函数。
    2)当把block_size设为比较大的值时,如block_size=21 or 31 or 41时,cvAdaptiveThreshold便是二值化函数了
    3)src与dst 这两个都要是单通道的图像。
    分析参数blockSize。这个参数相当重要,
    1.要取奇数,如果取偶数运行后就会报错!!原因看源码,发现要做一个掩模,所以参数必须是奇数。OpenCV也做了一个检测,在函数adaptiveThreshold一开始就有CV_Assert( blockSize % 2 == 1 && blockSize > 1 )。

    2.cvAdaptiveThreshold既可以做边缘提取,也可以实现二值化,是由你所选择的邻域所确定的,如果你所选择的邻域非常小(比如3×3),那么很显然阈值的“自适应程度”就非常高,这在结果图像中就表现为边缘检测的效果。如果邻域选择的比较大(比如31×31),那么阈值的“自适应程度”就比较低,这在结果图像中就表现为二值化的效果。

    3.一般情况下,滤波器宽度应该大于被识别物体的宽度。block_size太小,无法代表背景,太大的话会影响到临近物体。

    选定合适的block_size后,我们就可以选定一个更大的阈值param1,更好的抑制噪声

  • 相关阅读:
    CF 640(div4)
    ABC 166
    CF 637 div2
    HDU-1875 畅通工程再续
    POJ1251-Jungle Roads
    POJ1797 Heavy Transportation
    Gym-101911K Medians and Partition
    Gym-101911A Coffee Break
    【Vue】Re09 Webpack 第一部分(介绍、安装、配置)
    【Vue】Re08 模块化
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/12822097.html
Copyright © 2020-2023  润新知