簡單來玩影像混合 (Image Blending),使用兩張影像,依照權重混合出新的影像。
- 環境設定參考:Visual Studio 2010 安裝 OpenCV 2.4 beta
- 範例程式:C:\OpenCV2.4beta\samples\cpp\tutorial_code\ImgProc\AddingImages.cpp
/**
Theme: Image Blending
compiler: Visual Studio 2010 with OpenCV 2.4 beta
Date: 101/05/24
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv ){
double alpha = 0.5; double beta; double input;
Mat src1, src2, dst;
/// Ask the user enter alpha
cout<<" Simple Linear Blender "<<std::endl;
cout<<"-----------------------"<<std::endl;
cout<<"* Enter alpha [0-1]: ";
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("HappyMan's Girl1.jpg");
src2 = imread("HappyMan's Girl2.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 );
imwrite( "girl_blending.jpg", dst );
waitKey(0);
return 0;
}
這樣簡單的線性混合,可以依據兩個式子來描述:
- dst = alpha*src1 + beta*src2
- alpha + beta = 1
需要注意的是兩張影像長寬要一樣,不然執行後程式會當掉。
關鍵函式cvAddWeighted的使用方式:
void cvAddWeighted( const CvArr* src1, double alpha,
const CvArr* src2, double beta,
double gamma, CvArr* dst );
- src1:第一個影像
- alpha:第一個影像的權值
- src2:第二個影像
- beta:第二個影像的權值
- gamma:添加的常數項。
- dst:輸出的影像
多了gamma這個常數項,可以式子可以表示:
- dst(I) = src1(I) * alpha + src2(I) * beta + gamma
需注意所有的影像必須有相同的類型和相同的大小(或ROI大小)
依然請我的MV女孩來示範:P(點圖可放大)
左圖為HappyMan’s Girl2,右圖為HappyMan’s Girl1。
程式執行時可輸入[0, 1],我分別輸入0.3、0.5、0.8。
程式碼gamma參數分別設定為100和-100。
雖然執行程式時規定輸入[0, 1],但我這次分別輸入2和-2,出現無法預期的效果,這也可以說是一種藝術吧:P




隨意留個言吧:)~