什么是图像二值化?
图像二值化是将彩色或灰度图像转换为黑白图像的过程。在二值化过程中,将像素点的亮度值与某个阈值进行比较,如果亮度值大于等于阈值,则将该像素点设置为白色(通常用255表示),否则将其设置为黑色(通常用0表示)。
threshold函数介绍
OpenCV中的threshold函数用于对图像进行二值化处理。它可以将灰度图像转换为黑白图像,也可以对彩色图像进行分割。
函数原型如下:
void cv::threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
参数说明:
-
src:
输入的灰度图像或彩色图像。 -
dst:
输出的二值化图像。 -
thresh:
阈值,用于将像素点的亮度值与该值进行比较,从而确定像素点的颜色。 -
maxval
:最大值,当像素点的亮度值大于等于阈值时,将其设置为该值。 -
type:
二值化类型,常用的有以下几种:THRESH_BINARY:
大于等于阈值的像素点设置为最大值,小于阈值的像素点设置为0。THRESH_BINARY_INV:
大于等于阈值的像素点设置为0,小于阈值的像素点设置为最大值。THRESH_TRUNC:
大于等于阈值的像素点设置为阈值,小于阈值的像素点保持不变。THRESH_TOZERO:
大于等于阈值的像素点保持不变,小于阈值的像素点设置为0。THRESH_TOZERO_INV:
大于等于阈值的像素点设置为0,小于阈值的像素点保持不变。
使用场景
使用场景包括但不限于以下几种:
-
图像分割:将彩色或灰度图像分割成不同的区域,以便进行进一步的处理,如目标检测、图像增强等。
-
文字识别:对印刷体文字图像进行二值化处理,以便进行后续的文字识别和分析。
-
形态学操作:在图像处理中,经常需要对图像进行形态学操作,如腐蚀、膨胀、开运算、闭运算等,而这些操作都需要先进行二值化处理。
-
图像去噪:对含有噪声的图像进行二值化处理,可以将噪声与图像内容分离,从而达到去噪的目的。
-
图像增强:通过对图像进行二值化处理,可以突出图像中的某些特征,从而增强图像的质量和表现力。
使用案例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
// 读取原始图像
Mat src = imread("./3480e7ce_mk_tk_a_c2_6400_4480.png", IMREAD_GRAYSCALE);
if (src.empty())
{
cout << "无法读取图像" << endl;
return -1;
}
imshow("src", src);
waitKey(0);
// 二值化图像
Mat dst;
threshold(src, dst, 128, 255, THRESH_BINARY);
imshow("binary", dst);
waitKey(0);
threshold(src, dst, 128, 255, THRESH_BINARY_INV);
imshow("binary_inv", dst);
waitKey(0);
threshold(src, dst, 128, 255, THRESH_TRUNC);
imshow("trunc", dst);
waitKey(0);
threshold(src, dst, 128, 255, THRESH_TOZERO);
imshow("tozero", dst);
waitKey(0);
threshold(src, dst, 128, 255, THRESH_TOZERO_INV);
imshow("tozero_inv", dst);
waitKey(0);
return 0;
}
原始图像:
THRESH_BINARY:
THRESH_BINARY_INV:
THRESH_TRUNC:
THRESH_TOZERO:
THRESH_TOZERO_INV:
总结
OpenCV的threshold函数是一种非常常用的图像处理工具,可以应用于各种场景中,帮助我们更好地理解和分析图像数据。