高动态范围图像的英文名称为HDR,全称为High Dymamic Range。图像动态范围是指图像中像素亮度的最大值也最小值的比值,即最亮与最暗的灰度等级划分,动态范围越大,图像细节层次越丰富,表现形态越细腻。
HDR图像使用超过8bit/每通道(通常是32bit浮点值),这样极大地提高了图像动态范围。
现在有许多种不同的方式去获得HDR图像,最常用的方式就是对同一个场景使用不同的曝光值,然后再把这些图像合成起来。HDR图像生成后,如果要是,必须要进行转化才能显示,这个过程叫tonemapping。
具体的合成原理请自行查阅相关文献。
OpenCV中的photo模块提供HDR图像生成的相关函数和类。
类CalibrateCRF应用于相机响应校准算法。
类MergeExposure实现合并曝光单个图像序列算法。
类Tonemap实现HDR基础tonemapping算法。
代码如下:
代码中用到的文件Memorial_SourceImages下载地址链接:https://pan.baidu.com/s/1jI5XEU6 分享密码请搜索公众号"qxsf321",关注后回复0055即可获取
这个文件夹放置的路径如下图所示:

// opencv版本:OpenCV3.0
//VS版本:VS2013
//Author:qxsf321.net
#include <opencv2/photo.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(void)
{
//完整代码请请搜索公众号"qxsf321",关注后回复0055即可获取
//完整代码请请搜索公众号"qxsf321",关注后回复0055即可获取
//完整代码请请搜索公众号"qxsf321",关注后回复0055即可获取
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();
}
运行程序后,程序目录下生成了HDR(高动态范围)图像和LDR(低动态范围)图像。大家可以看出,HDR图像确实是集合了各个程序曝光度的图像的细节。

程序生成的HDR图像下载链接:https://pan.baidu.com/s/1hrWPSpe 密码:4pym
程序生成的LDR图像下载链接:https://pan.baidu.com/s/1miFwZNi 密码:1ukj
本文介绍了高动态范围图像(HDR)的概念,以及如何利用OpenCV的photo模块进行HDR图像的合成。通过不同曝光值的图像序列,使用CalibrateCRF、MergeExposure和Tonemap等工具进行处理,最终生成HDR图像。程序示例展示了如何实现这一过程,并提供了源图像和生成图像的下载链接。
3519





