opencv学习之------进行简单的图像算术

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函数将两幅图像叠加后的图像:

猜你喜欢

转载自blog.csdn.net/weixin_39746114/article/details/81137099