1. 程式人生 > >如何使用OPENCV實現兩張圖片的混合(PS中的圖層不透明度)

如何使用OPENCV實現兩張圖片的混合(PS中的圖層不透明度)

Goal

  • 什麼是線性混合,用於何處?
  • 怎麼使用addWeighted()?

Theory

前面已經學到了一點基本的畫素級操作,一個比較有趣的二元操作是線性混合操作:
  

g(x)=(1α)f0(x)+αf1(x)

α在0-1之間變化,這種操作用於兩幅影象或者錄影交叉融合。

示例程式碼

#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;

 //alpha必須在0-1之間
 if( input >= 0.0 && input <= 1.0 )
   { alpha = input; }

 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;
}

addWeighted( src1, alpha, src2, beta, 0.0, dst);
addWeighted執行:

dst=src1α+src2β+γ

在上面例子裡γ=0 。