OpenCV C++ 二值图像处理:阈值化技术全解析
二值图像(只有黑白两种像素值的图像)是许多高级图像处理任务的基础,它能简化图像数据、突出目标区域。本章将系统讲解图像阈值化的基本原理、全局阈值分割与自适应阈值分割的实现方法,以及各类方法的适用场景与参数调优技巧。
一、图像阈值化操作
图像阈值化是将灰度图像转换为二值图像的过程,通过设定一个或多个阈值,将像素值分为两类(通常是 0 和 255)。这一操作能有效分离目标与背景,简化图像分析。
1.1 阈值化基本原理
阈值化的核心思想是:
- 设定一个阈值
thresh
- 对于每个像素,根据其灰度值与阈值的关系赋予新值
- 结果图像仅包含两个像素值(如 0 和 255),形成二值图像
数学描述:
当像素值 > thresh:赋予值 maxval
当像素值 ≤ thresh:赋予值 0(或其他值,取决于阈值类型)
1.2 OpenCV 阈值化函数threshold
OpenCV 提供threshold
函数实现各种阈值化操作,函数原型:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
src
:输入图像(必须为单通道灰度图)dst
:输出二值图像thresh
:阈值(取值范围 0~255)maxval
:最大值(通常为 255,用于定义超过阈值时的像素值)type
:阈值化类型(决定像素值与阈值比较后的处理方式)- 返回值:实际使用的阈值(对于自动阈值算法)
1.3 常用阈值化类型及实现
OpenCV 支持 5 种基本阈值化类型,适用场景各有不同:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;void thresholdTypesDemo(const Mat& gray) {Mat dst1, dst2, dst3, dst4, dst5;double thresh = 127;double maxval = 255;// 1. 二进制阈值:超过阈值取maxval,否则取0threshold(gray, dst1, thresh, maxval, THRESH_BINARY);// 2. 反二进制阈值:超过阈值取0,否则取maxvalthreshold(gray, dst2, thresh, maxval, THRESH_BINARY_INV);// 3. 截断阈值:超过阈值取阈值,否则保持原值threshold(gray, dst3, thresh, maxval, THRESH_TRUNC);// 4. 阈值化为0:超过阈值保持原值,否则取0threshold(gray, dst4, thresh, maxval, THRESH_TOZERO);// 5. 反阈值化为0:超过阈值取0,否则保持原值threshold(gray, dst5, thresh, maxval, THRESH_TOZERO_INV);// 显示结果imshow("原图", gray);imshow("THRESH_BINARY", dst1);imshow("THRESH_BINARY_INV", dst2);imshow("THRESH_TRUNC", dst3);imshow("THRESH_TOZERO", dst4);imshow("THRESH_TOZERO_INV", dst5);
}int main() {Mat img = imread("test.jpg");if (img.empty()) {cout << "图像加载失败!" << endl;return -1;}// 转换为灰度图(阈值化操作必须输入单通道图像)Mat gray;cvtColor(img, gray, COLOR_BGR2GRAY);thresholdTypesDemo(gray);