opencv(三)对图像进行简单算术运算(加减乘除)

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的对偶运算,它将三个单通道合并一个彩色通道。

其他操作基本都和加运算差不多,这里就不一一介绍了。