opencv可以将图像以不同的方式组合,图像其实就是一般的矩阵,所以它们可以做加减乘除。opencv提供了各种图像算术操作符。
1【首先我们对两幅图像进行操作】
当我们需要一些图像特效或者在图像上叠加信息时,就需要用到图像加法。我们只需调用cv::add函数就可以完成,更准确的说是cv::addWeighted()函数来完成图像的加法。cv::addWeighted(image, 0.7, imag1, 0.9, 0.,result);
效果如下
所有的二值算术函数工作方式都是一样的,他接受两个输入变量和一个输出变量。在一些情况下,还需要指定权重作为运算中的标量因子。每种函数都有几个不同的形式:
//c[i] = a[i] + b[i];
cv::add(imageA, imageB, resultC);
//c[i] = a[i] + k;
cv::add(imageA, cv::Scalar(k), resultC);
//c[i] = k1 * a[i] + k2 * b[i] + k3;
cv::addWeighted(imageA, k1, imageB, k2, k3, resultC);
//c[i] = k * a[i] + b[i];
cv::scaleAdd(imageA, k,imageB,resultC);
//对某些函数,还可以指定一个图像的掩模
//if(mast[i]) c[i] = a[i] + b[i]
cv::add(imageA,imageB, resultC, mask);
参与运算的图像必须相同的大小和类型(输出图像如果合适不符,那么他会被重新分配)同样,由于运算是逐像素进行的,输入图像之一也可以作为输出图像。
opencv给我们重载了操作符,上面的操作可以换成下面:reslut = 0.7 * image + 0.9 * image,效果是一样的。有时候我们想对彩色图像的一个通道进行运算,我们可以使用cv::split函数将彩色图像的三个通道分别拷贝到三个独立的cv::Mat实例中,然后对其中一个通道单独处理:
std::vector(cv::Mat) planes;
cv::split(image, planes);
planes[0] += image1;
cv::merge(planes, result);
函数cv::merge是cv::splitr的对偶运算,它将三个单通道合并一个彩色通道。
其他操作基本都和加运算差不多,这里就不一一介绍了。