使用Opencv混合兩個圖像

目標

在本教程中,您將學習:

  • 什么是線性混合,為什么它很有用
  • 如何使用addWeighted()混合兩個圖像

理論

下面的解釋屬于Richard Szeliski的“ 《計算機視覺:算法與應用》 ”一書。

從以前的教程中,我們已經(jīng)知道了一些像素運算符。一個常見的二元(雙輸入)算子線性混合運算符

線性混合運算符

通過改變α從0→1,這個操作員可以用來執(zhí)行兩個圖像或視頻之間的時間交叉溶解,如幻燈片放映和電影制作效果所示。

code

//blend two imgs
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>


using namespace cv;
using namespace std;


int main(void)
{
    double alpha = 0.5; //control alpha
    
    double beta; double input;
    Mat src1, src2, dst;

    cout << " Simple Linear Blender " << endl;
    cout << "-----------------------" << endl;
    cout << "* Enter alpha [0.0-1.0]: ";

    cin >> input;// We use the alpha provided by the user if it is between 0 and 1

    if (input >= 0 && input <= 1)
    {
        alpha = input;
    }
    src1 = imread("Linux.jpg");
    src2 = imread("Windows.jpg");

    if (src1.empty()) { cout << "Error loading src1" << endl; return -1; }
    if (src2.empty()) { cout << "Error loading src2" << endl; return -1; }

    beta = (1.0 - alpha);

    
    addWeighted(src1, alpha, src2, beta, 0.0, dst);

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

解釋

混合公式

需要兩個原圖 ( f0(x) and f1(x)):

src1 = imread("Linux.jpg");
src2 = imread("Windows.jpg");

注意:src1和src2必須有一樣的size(weight, height)和type。

現(xiàn)在我們需要生成g(x)圖像。為此,函數(shù)addWeighted()非常方便:

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

因為addWeighted()產(chǎn)生:

在這種情況下,在上面的代碼中,gamma是參數(shù)0.0

結(jié)果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容