opencv可以将图像以不同的方式组合,图像其实就是一般的矩阵,所以它们可以做加减乘除。opencv提供了各种图像算术操作符。首先是图像相加,当我们需要一些图像特效或者在图像上叠加信息时,就需要用到图像加法。我们只需调用cv::add函数就可以完成,更准确的说是cv::addWeighted()函数来完成图像的加法。
函数调用如下:
cv::addWeighted(image1, 0.7, imag2, 0.9, 0.,result);
作用原理:
所有的二值算术函数工作方式都是一样的,他接受两个输入变量和一个输出变量。在一些情况下,还需要指定权重作为运算中的标量因子。每种函数都有几个不同的形式,CV::add是一个很好的例子:
//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);
参与运算的图像必须相同的大小和类型(输出图像如果合适不符,那么他会被重新分配)同样,由于运算是逐像素进行的,输入图像之一也可以作为输出图像。有时候我们想对彩色图像的一个通道进行运算,我们可以使用cv::split函数将彩色图像的三个通道分别拷贝到三个独立的cv::Mat实例中,然后对其中一个通道单独处理:
std::vector(cv::Mat) planes; //创建一个图像向量
cv::split(image, planes); //将一个三通道的图像分离成三个单通道图像
planes[0] += image2; //将新图层叠加到蓝色通道
cv::merge(planes, result);
函数cv::merge是cv::splitr的对偶运算,它将三个单通道合并一个彩色通道。
图像相加实例程序代码:
#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat img1, img2, result1;
img1 = imread("15.jpg");
img2 = imread("16.jpg");
result1 = img1.clone();
Mat_<Vec3b>::iterator it = result1.begin<Vec3b>(); //result1初始位置的迭代器
Mat_<Vec3b>::iterator itend = result1.end<Vec3b>(); //result1终止位置的迭代器
Mat_<Vec3b>::iterator it1 = img1.begin<Vec3b>(); //img1初始迭代器
Mat_<Vec3b>::iterator it2 = img2.begin<Vec3b>(); //img2初始迭代器
//进行遍历
for (; it != itend; it++)
{
(*it)[0] = ((*it1)[0] + (*it2)[0]) /2;
(*it)[1] = ((*it1)[1] + (*it2)[1]) /2;
(*it)[2] = ((*it1)[2] + (*it2)[2]) /2;
it1++;
it2++;
}
namedWindow("原图1",1);
imshow("原图1", img1);
namedWindow("原图2", 0);
imshow("原图2", img2);
namedWindow("相加后的图像",0);
imshow("相加后的图像", result1);
Mat result2 = result1.clone();
addWeighted(img1, 1, img2, 1, 0,result2);
namedWindow("addWeighted");
imshow("addWeighted", result2);
waitKey();
return 0;
}
程序运行结果如下:
原图1:
原图2:
相加后的图像:
使用addweighted函数将两幅图像叠加后的图像: