图像像素的灰度值无论在什么数据类型中都只有最大值和最小值两种取值,因此成为二值图像。二值图形色彩种类少,可以进行高度的压缩,节省了内存空间。在OpenCV中提供了threshold()函数和adaptiveThreshold()两个函数用于实现图像的二值化。
一、threshold()函数
函数原型:
double cv::threshold( InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
)
src:待二值化的图像,图像只能是CV_8U和CV_32F两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。
dst:二值化的图像,与输入图像具有相同的尺寸、数据类型和通道数。
thresh:二值化的阈值。
type:二值化过程的最大值,它只在THRESH_BINARY和THRESH_BINARY_INV两种二值化方法中才使用。
type:选择图像二值化方法的标志。
标志参数 | 简记 | 作用 |
THRESH_BINARY | 0 | 灰度值大于阈值的最大值,其他值为0 |
THRESH_BINARY_INV | 1 | 灰度值大于阈值的位0,其他值为最大值 |
THRESH_TRUNC | 2 | 灰度值大于阈值的位阈值,其他值不变 |
THRESH_TOZERO | 3 | 灰度值大于阈值的不变,其他值为0 |
THRESH_TOZERO_INV | 4 | 灰度值大于阈值的为0,其他值不变 |
THRESH_OTSU | 8 | 大津法自动寻求全局阈值 |
THRESH_TRIANGLE | 16 | 三角形法自动寻求区局阈值 |
二、adaptiveThreshold()函数
函数原型:
void cv::adaptiveThreshold(InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
src:待二值化的图像,图像只能是CV_8UC1数据类型。
dst:二值化的图像,与输入图像具有相同的尺寸、数据类型。
maxValue:二值化的最大值。
adaptiveMethod:自适应确定阈值的方法,分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C两种。
thresholdType:选择图像二值化方法的标志,只能是THRESH_BINARY和THRESH_BINARY_INV。
blockSize:自适应确定阈值的像素邻域大小,一般为3,5,7的奇数。
C:从平均值或者加权平均值中减去的常数,可以为正,也可以为负。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("954ea3bf5f65e2a6140a2d22e000ac4.png");
if (img.empty())
{
cout << "请确认图像文件名称是否正确" << endl;
return -1;
}
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat img_B, img_B_V, gray_B, gray_B_V, gray_T, gray_T_V, gray_TRUNC;
//彩色图像二值化
threshold(img, img_B, 125, 255, THRESH_BINARY);
threshold(img, img_B_V, 125, 255, THRESH_BINARY_INV);
imshow("img_B", img_B);
imshow("img_B_V", img_B_V);
//灰度图BINARY二值化
threshold(gray, gray_B, 125, 255, THRESH_BINARY);
threshold(gray, gray_B_V, 125, 255, THRESH_BINARY_INV);
imshow("gray_B", gray_B);
imshow("gray_B_V", gray_B_V);
//灰度图TOZERO变换
threshold(gray, gray_T, 125, 255, THRESH_TOZERO);
threshold(gray, gray_T_V, 125, 255, THRESH_TOZERO_INV);
imshow("gray_T", gray_T);
imshow("gray_T_V", gray_T_V);
//灰度图像TRUNC变换
threshold(gray, gray_TRUNC, 125, 255, THRESH_TRUNC);
imshow("gray_TRUNC", gray_TRUNC);
//灰度图像大律法和三角形法二值化
Mat img_Thr = imread("f9afe18da2fb1fa2ff72c4d8b29fe6a.png");
Mat img_Thr_O, img_Thr_T;
cvtColor(img_Thr, img_Thr, COLOR_BGR2GRAY);
threshold(img_Thr, img_Thr_O, 100, 255, THRESH_BINARY | THRESH_OTSU);
threshold(img_Thr, img_Thr_T, 125, 255, THRESH_BINARY | THRESH_TRIANGLE);
imshow("img_Thr", img_Thr);
imshow("img_Thr_O", img_Thr_O);
imshow("img_Thr_T", img_Thr_T);
waitKey(0);
return 0;
}