阈值分割概念
阈值处理是指剔除图像内像素值高于一定值或者低于一定值的像素点。从而将一幅灰度图像处理为一幅二值图像,有效的实现前景和背景的分离。
二值化,顾名思义,就是将某张图像的像素改成只有两个值,其操作的图像也必须是灰度图。
阈值分割的常用技术
-
全局阈值分割
-
自适应局部阈值分割
阈值分割的目的
1、突出目标对象
2、简化形态分析
3、增强对比
threshold函数
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
src:输入图像。
dst:输出图像,与输入图像具有相同的大小和类型。
thresh:设定的阈值。
maxval:当 type 参数为 THRESH_BINARY 或 THRESH_BINARY_INV 时需要设定的最大值。
type:阈值分割的类型

**阈值法(**THRESH_BINARY)
阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就 被设置为0(黑),大于阈值的像素就被设置为maxval,将原始图像处理为仅有两个值的二值图像。

反阈值法(THRESH_BINARY_INV)

**截断阈值法(**THRESH_TRUNC)
截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小 于等于阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。

低阈值零处理(THRESH_TOZERO)
低阈值零处理,字面意思,就是像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。

超阈值零处理(THRESH_TOZERO_INV)
超阈值零处理就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于等于阈值的部分不变。

OTSU****阈值法
OTSU算法是通过一个值将这张图分前景色和背景色(也就是灰度图中小于这个值的是一类,大于这个值的是一类)。
该方法使用的是聚类的思想,它把图像中所有像素点的像素值按灰度级分为两组。原则:
两组之间,灰度值差异最大。
每组之内,灰度值差异最小。
OTSU 阈值法通过以下步骤找到最佳阈值:
- 计算直方图:计算图像的灰度直方图。
- 计算类内方差和类间方差:对于每一个可能的阈值,计算分割后的两个类的方差。
- 选择最佳阈值:选择使类内方差最小(即类间方差最大)的阈值。
参数type增加"cv2.THRESH_OTSU"参数。
返回值ret是使用OTSU方法计算并得到的最优阈值。
通过OTSU算法得到阈值之后,就可以结合上面的方法根据该阈值进行二值化,即使在计算出阈值后结合了阈值法和反阈值法。
注意:使用OTSU算法计算阈值时,组件中的thresh参数将不再有任何作用。


自适应局部阈值分割
与全局阈值法相比,自适应二值化更加适合处理亮度分布不均的图像。自适应二值化法能够根据图像的不同区域计算不同的阈值,从而更好地处理亮度不均匀的图像。这种方法的主要优势包括:
-
局部适应:自适应二值化法通过对每个小区域分别计算阈值,从而保留更多的细节。
-
细节保留:自适应二值化法通过计算局部区域的阈值,可以更好地保留图像中的细节。
-
灵活性:自适应二值化法提供了多种计算局部阈值的方法,例如均值法和高斯加权平均法等。
adaptiveThreshold 函数
adaptiveThreshold(src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C);
src:输入图像,必须是单通道灰度图像。
dst:输出图像,与输入图像 src 具有相同大小和类型。
maxValue:阈值处理后最大值。
adaptiveMethod:自适应阈值方法。可选择以下两种方法:
ADAPTIVE_THRESH_MEAN_C`:在小区域内计算平均值作为阈值。
ADAPTIVE_THRESH_GAUSSIAN_C :在小区域内计算高斯加权和作为阈值。
thresholdType:阈值类型.
THRESH_BINARY :大于阈值的像素值设置为 maxValue ,其余设置为 0。
THRESH_BINARY_INV :大于阈值的像素值设置为 0,其余设置为 maxValue 。
blockSize:指定计算阈值的邻域大小。
C:从计算得到的阈值中减去的常数值。用于微调二值化结果。
取均值**(ADAPTIVE_THRESH_MEAN_C)**
我们所用到的不断滑动的小区域被称之为核,比如3X3的小区域叫做3X3的核,并且核的大小都是奇数个,也就是3X3、5X5、7X7等。
加权求和**(ADAPTIVE_THRESH_GAUSSIAN_C)**
对小区域内的像素进行加权求和得到新的阈值,其权重值来自于高斯分布。
而在opencv里,当kernel(小区域)的尺寸为1、3、5、7并且用户没有设置sigma的时候(sigma <= 0),核值就会取固定的系数,这是一种默认的值是高斯函数的近似。
