目录
1 概念讲解
图像二值化是将灰度图像转换为二值图像的过程,即将每个像素点的灰度值转化为黑白两个值之一。常见的图像二值化方法包括全局阈值法、自适应阈值法等。它可以帮助我们提取出感兴趣的物体或者轮廓,去除图像中的噪声,并且方便后续的图像分析和处理。
2 API函数详解
cv::threshold(const cv::Mat& src, cv::Mat& dst, double thresh, double maxval, int type)
该函数用于执行图像二值化操作:
src:是输入的灰度图像。
dst:是输出的二值图像,像素值只有0和255两种取值。
thresh:是阈值,用于将灰度图像中的像素值与阈值进行比较。
maxval:是最大值,用于设置超过阈值的像素值的输出值。
type:定义了二值化的类型,可选取以下几种:
cv::THRESH_BINARY:若src(x, y) > thresh,则dst(x, y) = maxval;否则dst(x, y) = 0。
cv::THRESH_BINARY_INV:若src(x, y) > thresh,则dst(x, y) = 0;否则dst(x, y) = maxval。
cv::THRESH_TRUNC:若src(x, y) > thresh,则dst(x, y) = thresh;否则保持原像素值不变。
cv::THRESH_TOZERO:若src(x, y) > thresh,则保持原像素值不变;否则dst(x, y) = 0。
cv::THRESH_TOZERO_INV:若src(x, y) > thresh,则dst(x, y) = 0;否则保持原像素值不变。
3 数学原理及公式
图像二值化的数学原理是将灰度图像中的像素值与阈值进行比较,并根据比较结果确定输出图像的像素值。根据选取的二值化类型,采用不同的逻辑关系来确定像素值。
对于cv::THRESH_BINARY类型:
dst(x, y) = (src(x, y) > thresh) ? maxval : 0
对于cv::THRESH_BINARY_INV类型:
dst(x, y) = (src(x, y) > thresh) ? 0 : maxval
对于cv::THRESH_TRUNC类型:
dst(x, y) = (src(x, y) > thresh) ? thresh : src(x, y)
对于cv::THRESH_TOZERO类型:
dst(x, y) = (src(x, y) > thresh) ? src(x, y) : 0
对于cv::THRESH_TOZERO_INV类型:
dst(x, y) = (src(x, y) > thresh) ? 0 : src(x, y)
4 代码实现
下面是一个示例代码,展示了如何使用OpenCV C++进行图像的二值化操作:
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取灰度图像
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);
// 定义变量存储二值化结果
cv::Mat binaryImage;
// 执行二值化操作
cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);
// 显示原图和二值化结果
cv::imshow("Original Image", image);
cv::imshow("Binary Image", binaryImage);
cv::waitKey(0);
return 0;
}
在上述代码中,首先使用cv::imread()函数读取灰度图像。然后,定义变量binaryImage用于存储二值化结果。接下来,使用cv::threshold()函数对灰度图像进行二值化操作,并将结果保存在binaryImage中。最后,使用cv::imshow()函数显示原图和二值化结果,并通过cv::waitKey(0)等待用户按下键盘任意键关闭窗口。
图像二值化可以根据不同的需求和应用场景选择合适的阈值及处理方法,以提高图像分析和处理的效果。在实际应用中,你可以根据需要调整阈值、最大值和二值化类型,以及对多通道图像进行适当的处理。确保在编译时链接OpenCV库并包含相关头文件。