天天看點

使用opencv和C++實作多焦距圖像合成

使用opencv和C++實作多焦距圖像合成

思路由這篇文章提出的算法,該文章是曝光合成,但是其原理 。用在多焦距的合成上,效果是勉強能接受。

使用opencv和C++實作多焦距圖像合成

圖檔:

待融合的圖檔

使用opencv和C++實作多焦距圖像合成
使用opencv和C++實作多焦距圖像合成

融合後的圖檔

使用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;
}

           

繼續閱讀