目录

1.  Otsu算法

2.  自适应阈值函数 adaptiveThreshold

3.  示例


1.  Otsu算法

         让 cv::threshold()  尝试确定阈值处理的最优值是可能的。只需传递参数 cv::THRESH_OTSU  作为 thresh 值即可。

         简言之,Otsu 算法考虑所有可能的阈值,并计算两类像素(即,低于阈值的像素类和高于阈值的像素类)的每一类的方差 \sigma_{i}^{2}  。Otsu 算法算小化下列值:

\sigma_{w}^{2 } = w_{1}(t) \cdot {\sigma}_{1}^{2} + w_{2}(t) {\cdot} {\sigma}_{2}^{2}

其中,w_{1}(t) 和 w_{2}(t)  由每一类像素中像素数量给出的两类相对权重,而  {\sigma}_{1}^{2}  和 {\sigma}_{2}^{2}  是每一类中的方差。它已证明,按这种方式最小化这两类方差与最小化这两类之间的方差相同。由于要求穷尽搜索可能阈值空间,因此,这种方法不是特别快。

2.  自适应阈值函数 adaptiveThreshold

         在该方法中,算法会针对图像的局部小区域分别计算阈值。因此,同一幅图像的不同区域将获得各自独立的阈值,从而针对光照变化不均的图像产生更佳的处理效果

         cv::adaptiveThreshold (src, dst, maxValue, adaptiveMethod, thresholdType, blockSize, C)

参数:

(1)  src——源 8 位单通道图像。

(2)  dst——与 src 大小及类型均相同的目标图像。

(3)  maxValue——为满足条件的像素赋予非零值。

(4)  adaptiveMethod——待使用的自适应阈值算法,它决定了如何计算阈值:

cv::ADAPTIVE_THRESH_MEAN_C

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);

}

运行结果:

原图:

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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐