上面的程序有以下几点需要说明:
1,staturate_cast<typename>是一个类型转换函数,程序里是为了确保运算结果还在uchar范围内。
2,row和col方法返回图像中的某些行或列,返回值是一个Mat。
3,setTo方法将Mat对像中的点设置为一个值,Scalar(n)为一个灰度值,Scalar(a,b,c)为一个彩色值。
六、图像的算术运算
Mat类把很多算数操作符都进行了重载,让它们来符合矩阵的一些运算,如果+、-、点乘等。
下面我们来看看用位操作和基本算术运算来完成本文中的colorReduce程序,它更简单,更高效。
将256种灰度阶降到64位其实是抛弃了二进制最后面的4位,所以我们可以用位操作来做这一步处理。
首先我们计算2^8降到2^n中的n:int n=static_cast<int>(log(static_cast<double>(div))/log(2.0));
然后可以得到mask,mask=0xFF<<n;
用下面简直的语句就可以得到我们想要的结果:
result=(image&Scalar(mask,mask,mask))+Scalar(div/2,div/2,div/2);
很多时候我们需要对图像的一个通信单独进行操作,比如在HSV色彩模式下,我们就经常把3个通道分开考虑。
1 vector<Mat> planes; 2 // 将image分为三个通道图像存储在planes中 3 split(image,planes); 4 planes[0]+=image2; 5 // 将planes中三幅图像合为一个三通道图像 6 merge(planes,result);