版权声明:本文为业余狙击手原创文章,欢迎阅读,欢迎转载,转载请注明出处,谢谢。 https://blog.csdn.net/sxlsxl119/article/details/85338025
目前的工作内容没有涉及HDR,但是看到HDR处理完的图像那么的绚丽多彩,光彩照人,五彩斑斓,五光十色,五颜六色,五彩缤纷,五花八门,五体投地....好吧,语文没学好,编不下去了.....就是想自己动手把opencv那个HDR的例子给跑一遍(使用OpenCV版本:3.4.1)!
纸上得来终觉浅,绝知此事要躬行!不得不说看别人的和自己动手做的是不一样的,此篇为了能亲眼看一下自己生成的“hdr.hdr”文件还是费了不少周折的。为了减少大家查找各种文章、原图、代码、阅读器等所花的时间精力,下面把我整理的资料都贡献给大家。
一,相关链接:
-
源码路径:.\sources\samples\cpp\tutorial_code\photo\hdr_imaging.cpp。
-
点击下载测试图片及“”hdr阅读器“”
-
HDR老外原文链接
-
类似参考(OpenCV3.0 HDR(高动态范围)示例代码以及用法)
-
hdr贴图查看器(HDR View) 1.2 汉化绿色版
二,代码:
头文件:
#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 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处理:
与其他代码不同的是,我在实际运行时遇到了以下错误,
imwrite("fusion.png", fusion * 255); //这样会报错
后来改成了这样:
Mat fusion2 = fusion * 255;
imwrite("fusion.png", fusion2 ); //直接将fusion * 255放到存图函数里会出错
里面加了获取图像最大值最小值,主要是想看看它的最大值和最小值差别有多大,得到最小值0.000607;最大值829.94049
最大值/最小值=1367380,一般的图像存储不了这么大的东塔范围,所以用了“.hdr”格式
int HDR()
{
vector<Mat> images;
vector<float> times;
loadExposureSeq(".//Memorial_SourceImages", 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);
Mat fusion2 = fusion * 255;
imwrite("fusion.png", fusion2 );
Mat ldr2 = ldr * 255;
imwrite("ldr.png", ldr2);
double minv = 0.0, maxv = 0.0;
double* minp = &minv;
double* maxp = &maxv;
minMaxIdx(hdr, minp, maxp);//最小值0.000607;最大值829.94049
imwrite("hdr.hdr", hdr);//高动态一般图像格式存储不了,所以用.hdr格式,原文如下:
//Now it's time to look at the results. Note that HDR image can't be
//stored in one of common image formats, so we save it to Radiance image (.hdr).
//Also all HDR imaging functions return results in [0, 1] range so we should multiply
//result by 255.
return 0;
}
调用:
//-----开始------
void COpenCVLearningDlg::OnBnClickedStartButton()
{
int a=HDR();
AfxMessageBox(_T("结束"));
}
三,效果图:
fusion.png
我实际测试存的图
网上的图 (这个差别好像不大)
ldr.png
我实际测试存的图
网上的图 (差别挺大的,应该是我用Mat ldr2 = ldr * 255;造成的)
hdr.hdr
我实际测试存的图
网上的图 (差别挺大的,这个hdr我没有做任何多余的处理,为啥会出现这种情况?难道和我的显示器有关?)