threshold()函数原型
double cv::threshold( InputArray src, OutputArray dst, double thresh,
double maxval, int type )
其中,src:待二值化的图像,图像只能是CV_8U和 CV_32F 两种数据类型。对于图像通道数目的要求与选择的二值化方法相关。
dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数。
thresh:二值化的阈值
maxval:二值化过程的最大值,它旨在THRESH_BINARY 和 THRESH_BINARY_INV 两种二值化方法才使用。
type:选择二值化方法的标志(见下表)
函数中有些阈值比较方法输出结果的灰度值不是二值的,而是具有一个取值范围,不过为了体现·其常用的功能,我们仍称其为二值化函数或者阈值比较函数。函数的部分参数和返回值是针对特定的算法才有用,但即使不使用这些方法,在使用函数时,也需要明确给出,不可默认。
二值化方法标志参数(type) | 作用 |
THRESH_BINARY | 灰度值大于阈值的为最大值,其他值为0 |
THRESH_BINARY_INV | 灰度值大于阈值的为0,其他值为最大值 |
THRESH_TRUNC | 灰度值大于阈值的为阈值,其他值不变 |
THRESH_TOZERO | 灰度值大于阈值的不变,其他值为0 |
THRESH_TOZERO_INV | 灰度值大于阈值的为0,其他值不变 |
THRESH_OTSU | 大津法自动寻求全局阈值 |
THRESH_TRIANGLE | 三角形法自动寻求全局阈值 |
adaptiveThreshold() 函数
threshold()函数全局只使用一个阈值,在实际情况下,由于光照不均匀以及阴影的存在,全局只有一个阈值会使得在阴影处的白色区域也会被函数二值化成黑色。而adaptiveThreshold() 函数提供了两种局部自适应阈值的二值化方法
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 :从平均值或者加权平均值中减去的常数,可以为正,也可以为负
该函数将灰度图像转换成二值图像,通过均值法和高斯法自适应地计算 blockSize × blockSize 邻域内的阈值,之后进行二值化,原理与前述相同。
示例:
#include <opencv2\opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("D:\\dijia.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("D:\\books.png", IMREAD_GRAYSCALE);
Mat img_Thr_O, img_Thr_T;
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);
//灰度图像自适应二值化
Mat adaptive_mean, adaptive_gauss;
adaptiveThreshold(img_Thr, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 55, 0);
adaptiveThreshold(img_Thr, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 55, 0);
imshow("adaptive_mean", adaptive_mean);
imshow("adaptive_gauss", adaptive_gauss);
waitKey(0);
return 0;
}
运行结果: