OpenCV实践- 叠加两幅图片
Posted tupelo-shen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV实践- 叠加两幅图片相关的知识,希望对你有一定的参考价值。
1 目标
(1) 什么是线性混合,有什么用?
(2) 怎样使用addWeighted混合两幅图像?
2 原理
详细的理论请参考计算机视觉:算法和应用一书。
这里我们直接应用其公式:
对于上面的公式,很有理解,等式右边就是两个像素值相加,但是权重比不同。所以,我们通过变化 ,区间是[0,1],这个操作就能带来一副由两幅图片临时相加得到的图像。如果将其应用在幻灯片放映或者视频播放中,岂不是很酷?
3 代码实现
道理很简单,直接上代码:
#include <cv.h>
#include <highgui.h>
#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 if it is between 0 and 1
if( input >= 0.0 && input <= 1.0 )
alpha = input;
/// Read image ( same size, same type )
src1 = imread("../images/LinuxLogo.jpg");
src2 = imread("../images/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;
4 代码解释
(1)为了实现上面的公式,
我们需要两幅源图像 和 ,我们使用下面的代码载入:
src1 = imread("../images/LinuxLogo.jpg");
src2 = imread("../images/WindowsLogo.jpg");
警告:因为我们要叠加src1和src2,所以两幅图片必须具有相同的大小(高和宽)和类型。
(2) 应用addWeighted
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
addWeighted的处理过程:
在这里, 就是上面代码中的0.0,它是一个标量,可以对合成后的图片进行像素的调整。
5 结论
运行结果:
上图中左半部分就是 = 0.0,右半部分是 = 100时的图片。
以上是关于OpenCV实践- 叠加两幅图片的主要内容,如果未能解决你的问题,请参考以下文章