二值化,也就是处理结果为0或1,当然是针对图像的各像素而言的
1或0,对应于有无,也就是留下有用的,删除无用的,有用的部分,就是关心的部分
在图像处理中,也不仅仅只是1或0,因为这两个值看起来都是黑的,人眼很难分辨清楚,那就放大一些,255或0,黑白就出来了
目标识别、图像分割、目标提取等后续应用,很多会基于二值化的结果。所以图像分析的二值化处理是一个重要环节。比如优快云的OpenCV技能树:
广义来说,分析或处理的结果中,各像素点只在0/255间取值,那就算是二值化,所以阈值、腐蚀与膨胀、开运算与闭运算、连通区域分析、轮廓等都算是
但在OpenCV 4中,阈值的结果可能也是彩色图像,开闭运算的输入就是二值化图像… 这个概念可能是错的,因为我还没有从头处理开闭运算。
所以,还是自己按自己的标准来处理,利于理解就行,无所谓对错
inRange
OpenCV中的inRange()函数可以实现图像的二值化,其功能是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0)。函数的语法格式如下:
void cv::inRange(InputArray _src, InputArray _lowerb, InputArray _upperb, OutputArray _dst);
其中,_src表示输入图像,可以是灰度图像或彩色图像;_lowerb表示下界的阈值,可以是一个标量值或与输入图像通道数相同的数组;_upperb表示上界的阈值,与_lowerb的类型相同,指定上界阈值;_dst表示输出图像,用于存储计算得到的阈值图像。
二值图像,可作为copyTo的参数,实现原图的部分拷贝
具体实现代码:
cv::Mat originMat = dstMat.clone();
int paramIndex = 0;
bool combineMaskFlag = GetParamValue_Bool(paramIndex++); // 0 - 过滤原图显示
int min0 = GetParamValue_Int(paramIndex++); // 1 - 通道0下限
int max0 = GetParamValue_Int(paramIndex++); // 2 - 通道0上限
int min1 = GetParamValue_Int(paramIndex++); // 3 - 通道1下限
int max1 = GetParamValue_Int(paramIndex++); // 4 - 通道1上限
int min2 = GetParamValue_Int(paramIndex++); // 5 - 通道2下限
int max2 = GetParamValue_Int(paramIndex++); // 6 - 通道2上限
int dim = dstMat.channels();
cv::Mat maskMat;
if(dim == 1)
inRange(dstMat, Scala