OpenCV 3.0以及以后版本集成了HDR算法,样例代码的路径为: .\sources\samples\cpp\tutorial_code\photo\hdr_imaging.cpp。
实现算法的参考文献为《Recovering high-dynamic range radiance maps from photographs》,作者主页:http://www.pauldebevec.com/Research/HDR/。
作者主页上有实验的测试图片序列,可以下载下来,配合样例代码使用。OpenCV官方文档也有详细的介绍,链接在此:http://docs.opencv.org/3.0-beta/doc/tutorials/photo/hdr_imaging/hdr_imaging.html。
下面简要说一下代码的使用,并展示一下效果:
代码并不长,如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <opencv2/photo.hpp> #include "opencv2/imgcodecs.hpp" #include <opencv2/highgui.hpp> #include <vector> #include <iostream> #include <fstream> using namespace cv; using namespace std; void loadExposureSeq(String, vector<Mat>&, vector<float>&); int main(int, char**argv) { argv[1]="./SourceImages"; vector<Mat> images; vector<float> times; loadExposureSeq(argv[1], images, times); Mat response; Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec(); calibrate->process(images, response, times); Mat hdr; Ptr<MergeDebevec> merge_debevec = createMergeDebevec(); merge_debevec->process(images, hdr, times, response); Mat ldr; Ptr<TonemapDurand> tonemap = createTonemapDurand(2.2f); tonemap->process(hdr, ldr); Mat fusion; Ptr<MergeMertens> merge_mertens = createMergeMertens(); merge_mertens->process(images, fusion); imwrite("fusion.png", fusion * 255); imwrite("ldr.png", ldr * 255); imwrite("hdr.hdr", hdr); return 0; } void loadExposureSeq(String path, vector<Mat>& images, vector<float>& times) { path = path + std::string("/"); ifstream list_file((path + "list.txt").c_str()); string name; float val; while(list_file >> name >> val) { Mat img = imread(path + name); images.push_back(img); times.push_back(1/val); } list_file.close(); }
我们需要做的有两点
1.设置好测试图片序列的路径。
2.简单修改一下list文件中的内容。
下载下来的文件夹里的内容如下图
既然有README.txt,当然先看README了;另外可以看到一共有16幅同一个场景,不同曝光程度下的测试图片;还有个memorial.hdr_image_list.txt 文本文件,这个文件其实就是代码中的list文件,自己把名字改为list就可以,里面列出了图片序列的图片名称、快门时间等(就是代码中的times);还有一副memorial.hdr文件,这个是assembled radiance maps,需要用作者主页上提供的专门软件工具打开,暂且不管。
memorial.hdr_image_list.txt 这个文件里面的内容需要稍微修改一下,原内容如下:
根据代码中读数据的顺序,修改为如下,只保留图像名称和快门时间,图像格式改为.png:
只要路径设置好,不习惯用命令行的,在代码里可以设置为argv[1]=“./Memorial_SourceImages”。直接运行,得到结果fusion.png,LDR.png如下,可以明显看到过曝区域和过暗区域都被很好的补偿,细节更加丰富:
fusion.png:
LDR.png
另外还有一个hdr.hdr文件,和前面说的一样,需要作者的工具软件打开。
基本就这样,具体的HDR原理还没有细看,下次写上。