Opencv学习——图像阈值化

来源:互联网 发布:知妈妈乐疯狂 编辑:程序博客网 时间:2024/05/19 20:46

图像阈值化是最常用的图像处理方法,在很多领域应用广泛,机器视觉中产品的识别和定位中往往需要采用阈值处理使产品的特征更加明显,易于后续的处理。
一般阈值化可以分为两种:
- 全局阈值化
- 局部阈值化


全局阈值化

全局阈值化顾名思义就是对整个图像进行阈值处理,所以阈值的选取就显得格外的重要。一般可以借助图像的直方图来选择合适的阈值。全局阈值处理比较适合目标与背景有较明显像素值差别的图像。


Opencv中全局阈值化类型有以下几种:
threshtype
需要说明的是还有一种阈值方式:
THRESH_OTSU 即大律法
大律法使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分。
大律法可以找到图像中满足要求的全局阈值,然后再根据这个阈值使用上图所示的阈值类型进行阈值处理。

Opencv中阈值化的函数为:

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

其中type即为阈值类型。


局部阈值化

局部阈值化是一种图像自适应阈值处理方法,可以在图像的局部区域实现较好的阈值处理效果。
常用的局部自适应阈值有两种:
- 局部邻域块的均值
- 局部邻域块的高斯加权和


Opencv中局部自适应阈值处理函数为:

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)

其中:
adaptiveMethod为自适应阈值方法,可选的方式有:
- ADAPTIVE_THRESH_MEAN_C
- ADAPTIVE_THRESH_GAUSSIAN_C

thresholdType为阈值类型,相比于全局阈值,自适应阈值化只有两种类型:
- THRESH_BINARY
- THRESH_BINARY_INV

blockSize为局部邻域块边长大小, C为从计算得到的均值或加权均值中减去的常量


示例代码

switch(type){    case 1: //全局二值化        threshold(img, dst_img, 100, 255, CV_THRESH_BINARY);        break;    case 2: //局部二值化(局部领域块均值)        adaptiveThreshold(img, dst_img, 255, CV_ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, blocksize, constValue);        break;    case 3: //局部二值化(局部邻域块高斯加权和)        adaptiveThreshold(img, dst_img, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, blocksize, constValue);        break;    case 4: //大律法Otus        threshvalue = threshold(img, dst_img, threshvalue, 255, CV_THRESH_OTSU);        threshold(img, dst_img, threshvalue, 255, CV_THRESH_BINARY);        break;}

结果如图:
全局阈值化
Threshold


邻域均值局部阈值化
adaptivethresh_mean


邻域高斯加权和局部阈值化
adaptivethresh_Gaussianmean


大律法
OTUS
大律法得到的全局阈值为157。