使用openCV求两幅图像加和

来源:互联网 发布:win10办公软件下载 编辑:程序博客网 时间:2024/05/18 01:40


本文转自:http://blog.csdn.net/chenjiazhou12/article/details/21105627   谢谢博主!

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

1、原理

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

g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

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

2、代码实现

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. // Adding (blending) two images using OpenCV.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. #include <opencv2/core/core.hpp>  
  7. #include <opencv2/highgui/highgui.hpp>  
  8. #include <iostream>  
  9.   
  10. using namespace cv;  
  11.   
  12. int main( int argc, char** argv )  
  13. {  
  14.     double alpha = 0.5; double beta; double input;  
  15.   
  16.     Mat src1, src2, dst;  
  17.   
  18.     /// Ask the user enter alpha  
  19.     std::cout<<" Simple Linear Blender "<<std::endl;  
  20.     std::cout<<"-----------------------"<<std::endl;  
  21.     std::cout<<"* Enter alpha [0-1]: ";  
  22.     std::cin>>input;  
  23.   
  24.     /// We use the alpha provided by the user iff it is between 0 and 1  
  25.     if( alpha >= 0 && alpha <= 1 )  
  26.     { alpha = input; }  
  27.   
  28.     /// Read image ( same size, same type )  
  29.     src1 = imread("LinuxLogo.jpg");  
  30.     src2 = imread("WindowsLogo.jpg");  
  31.   
  32.     if( !src1.data ) { printf("Error loading src1 \n"); return -1; }  
  33.     if( !src2.data ) { printf("Error loading src2 \n"); return -1; }  
  34.   
  35.     /// Create Windows  
  36.     namedWindow("Linear Blend", 1);  
  37.   
  38.     beta = ( 1.0 - alpha );  
  39.     addWeighted( src1, alpha, src2, beta, 0.0, dst);  
  40.   
  41.     imshow( "Linear Blend", dst );  
  42.   
  43.     waitKey(0);  
  44.     return 0;  
  45. }  

3、运行结果

   

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

4、总结

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

addWeighted:

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

结构:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 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实现原理如下:

                        dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma

0 0
原创粉丝点击