• 图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果;
  • 二值化一般是提取轮廓的准备工作;
  • 二值化处理之后,图像只有0或255,变成黑白图像。

OpenCV中有全局二值化和局部二值化,全局二值化对光线敏感,局部二值化可以克服光线的影响

全局二值化

double threshold( InputArray src,//src输入数组(多通道,8位或32位浮点)。
				  OutputArray dst,//dst输出数组的大小和类型与src相同,通道数相同。
                  double thresh, //二值化阈值,阈值两端的分别置为0、255
                  double maxval, //与#THRESH_BINARY=0和#THRESH_BINARY_INV=1一起使用的maxval最大值类型。(8位图像为255)
                  int type //二值化类型
                  );

全局二值化类型(第五个参数type):

CV_THRESH_BINARY      =0,  /**值大于阈值置为最大值,否则为0*/
    CV_THRESH_BINARY_INV  =1,  /**值大于阈值置为0,否则为最大值*/
    CV_THRESH_TRUNC       =2,  /**值大于阈值置为阈值,否则不变*/
    CV_THRESH_TOZERO      =3,  /**值大于阈值不变,否则置为0*/
    CV_THRESH_TOZERO_INV  =4,  /**值大于阈值置为0,否则不变*/
    
    CV_THRESH_OTSU        =8, /**<利用大津法自动选择最优阈值;将标志与上述CV_THRESH_x值之一组合 */
    CV_THRESH_TRIANGLE    =16  /**采用三角形算法选择最优阈值;将标志与上述CV_THRESH_x值之一组合,但不能用CV_THRESH_OTSU*/

大津法和三角形算法都是根据图像自动指定最优阈值的算法,不需要人工指定阈值,常用OTSU,减少图像亮度、对比度的影响。

采用大津法自动确定阈值的全局二值化效果:

threshold(inputImg,outImg,100,255,CV_THRESH_OTSU);

局部二值化

void adaptiveThreshold( InputArray src, //src输入数组(多通道,8位或32位浮点)。
						OutputArray dst,//dst输出数组的大小和类型与src相同,通道数相同。
                        double maxValue, //分配给满足条件的像素的maxValue非零值
                        int adaptiveMethod,//adaptiveMethod要使用的自适应阈值算法
                        int thresholdType, //thresholdType阈值类型,必须是#THRESH_BINARY或#THRESH_BINARY_INV
                        int blockSize, //用于计算阈值的像素邻域的块大小,只能是单数
                        double C //
                        );

自适应阈值化计算大概过程是为每一个象素点单独计算的阈值,即每个像素点的阈值都是不同的,就是将该像素点周围blockSize*blockSize区域内的像素加权平均,然后减去一个常数C,从而得到该点的阈值

自适应阈值算法(第四个参数):

CV_ADAPTIVE_THRESH_MEAN_C  =0,//为局部邻域块的平均值,该算法是先求出块中的均值,再减去常数C
    CV_ADAPTIVE_THRESH_GAUSSIAN_C  =1//为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算,再减去常数C。

阈值类型(第五个参数)与全局二值化相同。

采用高斯函数求加权平均的局部二值化效果:

adaptiveThreshold(inputImg,outImg,255,CV_ADAPTIVE_THRESH_GAUSSIAN_C,CV_THRESH_BINARY,15,10);//局部二值化处理