OpenCV_14HDR

       目前的工作内容没有涉及HDR,但是看到HDR处理完的图像那么的绚丽多彩,光彩照人,五彩斑斓,五光十色,五颜六色,五彩缤纷,五花八门,五体投地....好吧,语文没学好,编不下去了.....就是想自己动手把opencv那个HDR的例子给跑一遍(使用OpenCV版本:3.4.1)!

       纸上得来终觉浅,绝知此事要躬行!不得不说看别人的和自己动手做的是不一样的,此篇为了能亲眼看一下自己生成的“hdr.hdr”文件还是费了不少周折的。为了减少大家查找各种文章、原图、代码、阅读器等所花的时间精力,下面把我整理的资料都贡献给大家。

一,相关链接:

二,代码:

 头文件:

#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我没有做任何多余的处理,为啥会出现这种情况?难道和我的显示器有关?) 

欢迎扫码关注我的微信公众号

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值