学习OpenCV范例(四)——使用OpenCV对两幅图像求和(求混合(blending))

这个范例相对来说比较简单,简单到在OpenCV的sample里面都没有提供源代码,只能自己复制黏贴tutorial中的代码了,范例中介绍了线性混合操作的原理,和OpenCV提供的 addWeighted()函数的用法,虽然简单,但实现的功能还是挺有趣的,看看吧。

1、原理

线性混合操作 也是一种典型的二元(两个输入)的 像素操作 :

通过在范围 0 \rightarrow 1 内改变 \alpha ,这个操可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果。主要是在第一幅图片中提取一定权重的像素值,在第二幅图片中提取一定权重的像素值,然后相加赋值给最后的图片,就这么简单。

2、代码实现

// Adding (blending) two images using OpenCV.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;

int main( int argc, char** argv )
{
	double alpha = 0.5; double beta; double input;

	Mat src1, src2, dst;

	/// Ask the user enter alpha
	std::cout<<" Simple Linear Blender "<<std::endl;
	std::cout<<"-----------------------"<<std::endl;
	std::cout<<"* Enter alpha [0-1]: ";
	std::cin>>input;

	/// We use the alpha provided by the user iff it is between 0 and 1
	if( alpha >= 0 && alpha <= 1 )
	{ alpha = input; }

	/// Read image ( same size, same type )
	src1 = imread("LinuxLogo.jpg");
	src2 = imread("WindowsLogo.jpg");

	if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
	if( !src2.data ) { printf("Error loading src2 \n"); return -1; }

	/// Create Windows
	namedWindow("Linear Blend", 1);

	beta = ( 1.0 - alpha );
	addWeighted( src1, alpha, src2, beta, 0.0, dst);

	imshow( "Linear Blend", dst );

	waitKey(0);
	return 0;
}

3、运行结果

学习OpenCV范例(四)——使用OpenCV对两幅图像求和(求混合(blending))_第1张图片   学习OpenCV范例(四)——使用OpenCV对两幅图像求和(求混合(blending))_第2张图片

        图1、alpha值为0.5                                 图2、alpha值为0.2

4、总结

程序可以根据输入的alpha值,来确定权重,从而影响两幅图片所显示的情况。

addWeighted:

功能:计算两个矩阵的加权和

结构:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)

  • src1:第一幅图片
  • alpha :第一幅图片的权重
  • src2 :第二幅图片,size和channel和第一幅图片一样
  • beta :第二幅图片的权重
  • dst :输出图片,size和chann和输入图片一样
  • gamma :附加的数值
  • dtype :默认为-1,即输出图片深度和src1图片深度一样

addWeighted实现原理如下:

                        

你可能感兴趣的:(opencv,范例,线性混合,图像求和,addWeighted)