目录
[1. Otsu算法](#1. Otsu算法)
[2. 自适应阈值函数 adaptiveThreshold](#2. 自适应阈值函数 adaptiveThreshold)
[3. 示例](#3. 示例)
1. Otsu 算法
让 cv::threshold() 尝试确定阈值处理的最优值是可能的。只需传递参数 cv::THRESH_OTSU 作为 thresh 值即可。
简言之,Otsu 算法考虑所有可能的阈值,并计算两类像素(即,低于阈值的像素类和高于阈值的像素类)的每一类的方差 。Otsu 算法算小化下列值:
其中, 和
由每一类像素中像素数量给出的两类相对权重,而
和
是每一类中的方差。它已证明,按这种方式最小化这两类方差与最小化这两类之间的方差相同。由于要求穷尽搜索可能阈值空间,因此,这种方法不是特别快。
2. 自适应阈值函数adaptiveThreshold
在该方法中,算法会针对图像的局部小区域分别计算阈值。因此,同一幅图像的不同区域将获得各自独立的阈值,从而针对光照变化不均的图像产生更佳的处理效果。
cv::adaptiveThreshold (src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)
参数:
(1) src------源 8 位单通道图像。
(2) dst------与 src 大小及类型均相同的目标图像。
(3) maxValue------为满足条件的像素赋予非零值。
(4) adaptiveMethod------待使用的自适应阈值算法,它决定了如何计算阈值:
cv::ADAPTIVE_THRESH_GAUSSIAN_C
(5) thresholdType ------阈值类型,必须为 cv::THRESH_BINARY 或 cv::THRESH_BINARY_INV。
(6) blockSize ------用于计算像素阈值的像素邻域大小:3、5、7 等 。
(7) C------从均值或加权均值中减去的常数(详见下文)。通常为正值,但也可能为零或负值。
3. 示例
void Test_adaptiveThreshold()
{
string filename = "D:\\TestVideo\\Flower6-2.jpg";
Mat src, src_gray, dst;
src = imread(samples::findFile(filename), IMREAD_COLOR); // Load an image
cvtColor(src, src_gray, COLOR_BGR2GRAY); // 转换为灰度图像
cv::adaptiveThreshold(
src_gray,
dst,
255,
cv::ADAPTIVE_THRESH_GAUSSIAN_C,
cv::THRESH_BINARY,
3,
2
);
// Show the results.
//
cv::imshow("Adaptive Threshold", dst);
cv::waitKey(0);
}
运行结果:
原图:

自适应阈值处理后的图像:
