OpenCV學習筆記之圖像融合

一、線性融合操作

 線性混合操作 也是一種典型的二元(兩個輸入)的 像素操作 :

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

通過在範圍 0 \rightarrow 1 內改變 \alpha ,這個操可以用來對兩幅圖像或兩段視頻產生時間上的 畫面疊化 (cross-dissolve)效果,就像在幻燈片放映和電影製作中那樣

二、操作實踐

#include <QCoreApplication>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <QDebug>
#include <QDir>
#include <QFile>
#include "iostream"

using namespace std;
using namespace cv;

int main()
{
    double alpha = 0.5; double beta;
    Mat src1, src2, dst;
    //! 讀取圖片
    src1 = imread("C:/2.png");
    src2 = imread("C:/3.png");

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

    //! 調整兩幅圖片保持一致,否則會出錯
    resize(src2, src2, Size(src1.cols, src1.rows));

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

    imshow( "Linear Blend", dst );
    waitKey(0);
    return 0;
}

  

src1                                src2                                 dst

參考資料:

附錄1:addWeighted()函數實現圖像線性混合

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);  
第一個參數,InputArray類型的src1,表示需要加權的第一個數組,常常填一個Mat。
第二個參數,alpha,表示第一個數組的權重
第三個參數,src2,表示第二個數組,它需要和第一個數組擁有相同的尺寸和通道數。
第四個參數,beta,表示第二個數組的權重值。
第五個參數,dst,輸出的數組,它和輸入的兩個數組擁有相同的尺寸和通道數。
第六個參數,gamma,一個加到權重總和上的標量值。看下面的式子自然會理解。
第七個參數,dtype,輸出陣列的可選深度,有默認值-1。;當兩個輸入數組具有相同的深度時,這個參數設置爲-1(默認值),即等同於src1.depth()。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章