目標
在本教程中,您將學習:
- 什么是線性混合,為什么它很有用
- 如何使用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