目录
1 概念讲解
图像自适应二值化是一种将灰度图像转换为二值图像的方法,它将图像分成多个局部区域,并根据每个局部区域的特点动态地选择阈值。相比于全局阈值二值化,图像自适应二值化可以更好地处理光照不均匀或图像中存在强烈反差的情况。
图像自适应二值化常用于文档扫描、字符识别、图像分割等领域,以提高对图像中细节和边缘的准确检测和分析能力。
2 函数详解
在OpenCV中,cv::adaptiveThreshold()函数用于执行图像自适应二值化操作。该函数的定义如下:
void adaptiveThreshold(
InputArray src, // 输入图像(单通道灰度图像)
OutputArray dst, // 输出二值图像
double maxValue, // 超过阈值的像素值设置为的最大值
int adaptiveMethod, // 自适应阈值计算方法(ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C)
int thresholdType, // 阈值类型(THRESH_BINARY或THRESH_BINARY_INV)
int blockSize, // 局部区域的尺寸,必须是奇数且大于1
double C // 从平均值或加权平均值中减去的常数
);
3 数学原理
图像自适应二值化的数学原理基于局部像素的统计信息,其核心思想是根据局部区域内的像素值动态地计算阈值。
具体而言,对于每个像素点,自适应二值化会计算以该像素为中心的局部区域的均值或加权均值,并将其作为阈值。然后,根据阈值将像素设置为黑色或白色。这样,就可以根据不同局部区域的特点,更好地处理光照变化和背景噪声等问题。
对于自适应二值化中的两种方法,即MEAN和GAUSSIAN,它们的公式如下:
3.1 MEAN方法
阈值计算方法:
3.2 GAUSSIAN方法
阈值计算方法:
其中,mean表示局部区域内像素值的平均值,standardDeviation表示局部区域内像素值的标准差,C是一个常数,用于调整阈值的灵敏度。
4 代码实现
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取图像
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
// 应用自适应二值化
cv::Mat adaptiveImage;
cv::adaptiveThreshold(image, adaptiveImage, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 11, 2);
// 显示原图和自适应二值化结果
cv::imshow("Original Image", image);
cv::imshow("Adaptive Threshold Image", adaptiveImage);
cv::waitKey(0);
return 0;
}