- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
函数对数组应用自适应阈值。
该函数根据以下公式将灰度图像转换为二值图像:
-
对于 THRESH_BINARY:
t e x t d s t ( x , y ) = { maxValue 如果 src ( x , y ) > T ( x , y ) 0 否则 \\text{dst}(x, y) =\begin{cases}\ \text{maxValue} & \text{如果 } \text{src}(x, y) > T(x, y) \\ 0 & \text{否则} \end{cases} textdst(x,y)={ maxValue0如果 src(x,y)>T(x,y)否则 -
对于THRESH_BINARY_INV:
dst ( x , y ) = { 0 如果 src ( x , y ) > T ( x , y ) maxValue 否则 \text{dst}(x, y) = \begin{cases} 0 & \text{如果 } \text{src}(x, y) > T(x, y) \\ \text{maxValue} & \text{否则} \end{cases} dst(x,y)={0maxValue如果 src(x,y)>T(x,y)否则其中 T ( x , y ) T(x,y) T(x,y) 是为每个像素单独计算的阈值(参见 adaptiveMethod 参数)。
adaptiveThreshold() 函数是 OpenCV 中用于实现自适应阈值处理的一种方法。这种处理方式特别适用于照明条件变化较大的场景,因为它能够根据图像局部区域的亮度自动调整阈值。
该函数可以原地处理图像。
函数原型
cpp
void cv::adaptiveThreshold
(
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
参数
- 参数src 源 8 位单通道图像。
- 参数dst 目标图像,具有与 src 相同的大小和类型。
- 参数maxValue 分配给满足条件的像素的非零值。
- 参数adaptiveMethod 使用的自适应阈值算法,参见 AdaptiveThresholdTypes。使用 BORDER_REPLICATE | BORDER_ISOLATED 来处理边界。
- 参数thresholdType 阈值类型,必须是 THRESH_BINARY 或 THRESH_BINARY_INV,参见 ThresholdTypes。
- 参数blockSize 用于计算像素阈值的像素邻域大小:3, 5, 7 等等。
- 参数C 从均值或加权均值中减去的常数(参见下面的详细信息)。通常它是正数,但也可能是零或负数。
代码示例
cpp
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像
Mat image = imread("/media/dingxin/data/study/OpenCV/sources/images/sun2.jpg", IMREAD_GRAYSCALE);
if (image.empty()) {
std::cerr << "Error: Could not open or find the image." << std::endl;
return -1;
}
// 创建输出图像
Mat binaryImage;
// 应用自适应阈值处理
adaptiveThreshold(image, binaryImage, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, 2);
// 显示结果
namedWindow("Original Image", WINDOW_NORMAL);
imshow("Original Image", image);
namedWindow("Binary Image", WINDOW_NORMAL);
imshow("Binary Image", binaryImage);
waitKey(0);
return 0;
}