OpenCV杂项图像变换(1)自适应阈值处理函数adaptiveThreshold()的使用

  • 操作系统: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;
}

运行结果

相关推荐
取个名字真难呐27 分钟前
6、PyTorch中搭建分类网络实例
人工智能·pytorch·分类
池佳齐33 分钟前
《AI大模型开发笔记》——Prompt提示词最佳实践
人工智能·笔记·prompt
亿信华辰软件35 分钟前
从传统分析到智能问数,打造零门槛数据分析方案
人工智能·数据分析·大模型bi
前端搬砖小助手1 小时前
开源 LLM 网关:APIPark 能做什么?
人工智能·开源·api·llm网关·api开放平台·api门户
Together_CZ2 小时前
EasyAnimate:基于Transformer架构的高性能长视频生成方法
人工智能·深度学习·transformer·easyanimate
Eric.Lee20212 小时前
数据集-目标检测系列- 人与猫互动 猫 检测数据集 cat in the house >> DataBall
人工智能·yolo·目标检测·计算机视觉·猫咪检测·猫与人互动
小白的程序空间2 小时前
人工智能之机器学习5-回归算法1【培训机构学习笔记】
人工智能·机器学习·回归
chenchihwen2 小时前
《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1
人工智能
澜舟孟子开源社区2 小时前
“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体
人工智能·科技·agi
Mr.鱼2 小时前
opencv undefined reference to `cv::noarray()‘ 。window系统配置opencv,找到opencv库,但连接不了
人工智能·opencv·计算机视觉