使用opencv和C++實作多焦距圖像合成
思路由這篇文章提出的算法,該文章是曝光合成,但是其原理 。用在多焦距的合成上,效果是勉強能接受。
圖檔:
待融合的圖檔
融合後的圖檔
C++代碼片
//論文"Exposure Fusion"中的方法
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void readImages(vector<Mat>& images)//加引用可節省50%的記憶體消耗
{
int numImages = 2;//有幾張圖檔這兒就填幾
static const char* filenames[] =
{
"D:\\Data\\Code-Pro\\code-test\\pic_fusion\\lena.png",
"D:\\Data\\Code-Pro\\code-test\\pic_fusion\\logo.png"
};
for (int i = 0; i < numImages; i++)
{
Mat im = imread(filenames[i]);
images.push_back(im);
}
}
int main()
{
vector<Mat> images;
//讀取圖檔
readImages(images);
//對齊圖檔
Ptr<AlignMTB> alignMTB = createAlignMTB();
alignMTB->process(images, images);
//曝光合成(Mertens是該論文的作者)被OpenCV內建為函數了
Mat Fusion;
Ptr<MergeMertens> mergeMertens = createMergeMertens();
mergeMertens->process(images,Fusion);
imshow("融合圖像", Fusion);
//将融合後的圖像在指定位置進行儲存
imwrite("D:\\Data\\Code-Pro\\code-test\\pic_fusion\\fusion.png",Fusion*255);//*255是将圖像從0-1反歸一化為0-255
waitKey();
return 0;
}