一、图像二值化
固定阈值二值化
threshold ( lnputArray src, outputArray dst,double thresh, double maxvall, int type
src:待二值化的图像,图像只能是CV_8U和CV_32F两种数据类型。对于图像通道数目的要求和选择的二值化方法相关。
dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型和通道数。thresh:二值化的阀值。
maxval:二值化过程的最大值。
type:选择图像二值化方法的标志。
自适应阈值二值化
adaptiveThreshold(lnputArray src, outputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize,
double c)
src:二值化的图像,图像只能是CV_8UC1数据类型。
dst:二值化后的图像,与输入图像具有相同的尺寸、数据类型。
max Value:二值化的最大值。
adaptiveMethod:自制应确定阈值的方法,分为均值法ADAPTIVE_THRESH_MEAN_C和高斯法ADAPTIVE_THRESH_GAUSSIAN_C这两种。
thresholdType:选择图像二值化方法的标志,只能是THRESH_ BINARY和THRESH_BINARY_INV。
blockSize:自适应确定阈值的像素邻域大小,一般为3,5,7的奇数。
C:从平均值或者加权平均值中减去的常数,可以为正,也可以为负。
代码样例如下:
adaptiveThreshold(img_Thr,adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,55,0);
adaptiveThreshold(img_Thr,adaptive_meaQ 255, ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,55,0);
二、LUT查找表
LUT查找表样例如上,就是将以定范围内的值映射为不同的数组操作。
LUT(InputArray Src,lnputArray lut,OutputArray dst)
src:输入图像矩阵,其数据类型只能是CV_8U。
lut: 256个像素灰度值的查找表,单通道或者与src通道数相同。
dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同。
样例代码如下:
//查找表第一层
uchar lutFirst[256];
for (int i = 0; i < 256; i++)
{
if (i <= 100)
lutFirst[i] = 0;
if (i>100 && i<= 200)
{
lutFirst[i] = 100;
}
if (i > 200)
{
lutFirst[i] = 255;
}
}
Mat lutOne(1, 255, CV_8UC1, lutFirst);
//查找表第一层
uchar lutSecond[256];
for (int i = 0; i < 256; i++)
{
if (i <= 100)
lutFirst[i] = 0;
if (i > 100 && i <= 200)
{
lutFirst[i] = 150;
}
if (i > 200)
{
lutFirst[i] = 255;
}
}
Mat lutTwo(1, 255, CV_8UC1, lutSecond);
//查找表第三层
uchar lutThird[256];
for (int i = 0; i < 256; i++)
{
if (i <= 100)
lutFirst[i] = 0;
if (i > 100 && i <= 200)
{
lutFirst[i] = 200;
}
if (i > 200)
{
lutFirst[i] = 255;
}
}
Mat lutThree(1, 255, CV_8UC1, lutThird);
//将三层生成为多通道的矩阵
vector<Mat> mergeMats;
mergeMats.push_back(lutOne);
mergeMats.push_back(lutTwo);
mergeMats.push_back(lutThree);
Mat LutTree;
//合并多通道
merge(mergeMats, LutTree);
//读取图片
Mat src = imread("图片2.png");
Mat gray, out0, out1, out2;
cvtColor(src, gray, COLOR_BGR2GRAY);
//映射像素值
LUT(gray, lutOne, out0);
LUT(src, lutOne, out1);
LUT(src, LutTree, out2);