我们已经知道的是,使用copyTo函数可以得到一个复制的矩阵。
A.copyTo(B);
就可以得到和A一毛一样的矩阵B。当然需要事先声明B。并且两者可以互不相关的做各种操作。
copyTo还有一个重构函数copyTo(B,MASK)。意思是可以得到一个附加掩膜MASK的矩阵B。我们从图像的角度来看这个函数的作用。
首先需要生成一张掩膜MASK,一般情况下这个膜和你需要操作的对象图像一样大。生成方法见下面例子:
Mat MASK(A.rows,A.cols,CV_8UC3,Scalar(0,0,0));//生成一个三通道的彩色掩膜,初始化为黑色。
Mat MASK(A. rows ,A. cols , CV_8UC1 , Scalar ( 0 ));//生成一个灰度的掩膜,初始化为黑色。Mat MASK=Mat::zeros(A.size( ), CV_8UC3);//生成一个三通道的彩色掩膜,初始化为黑色。需要改成灰度的只需把CV_8UC3改为CV_8UC1。
对一幅图加一个掩膜顾名思义,就是想要盖住图片的某一部分。所以使用A.copyTo(B,MASK)之后得到的是A被MASK掩盖后的图像。因为初始化的掩膜时黑色的,如果直接加上去整个图片都会被掩盖了,所以需要把一部分你不想盖住的位置改成别的颜色。这里就可以用到前面的设置ROI的算法。
Mat mm=mask(Rect(0,0,mask.cols/2,mask.rows));//设置一个只有掩膜一半大小的ROI
mm={Scalar(255,255,255)};//把ROI中的像素值改为白色。
得到的掩膜效果如下图:
对于灰度图像,掩盖后在图像中掩膜中所有像素值对应为0的点变为黑色(被掩盖),其他点(所有非0值)和原来一致。
对于三通道彩色图像,某个通道中所有在掩膜中值为0的点在该通道上的像素值变为0,其他所有非0值保持和原来不变。例如当对绿色和蓝色通道加掩膜时会呈现一种图像被盖了一层红色的效果。(因为蓝色和绿色被掩盖了)
不管是灰度图像还是彩色图像,只有掩膜中像素值为0的点会对图像产生掩盖效果。
以下分别是黑色掩膜,红色掩膜的效果图: