opencv高动态—多曝光融合

动态范围:动态范围值图像最大亮度与最小亮度比值,低动态范围图像动态范围大致在10的平方,高动态范围图像动态范围10的四次方到10的九次方。

相机响应函数CRF:光学镜头CCD图像传感器上捕获到的亮度和数字图像像素值之间的非线性关系。分为基于多曝光和单帧图像。

#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>


using namespace std;
using namespace cv;


void readImagesAndTimes(vector<Mat>& images,vector<float>& times) {
	int numImages = 4;
	//曝光时间列表
	static const float timesArray[] = { 1 / 30.0f,0.25,2.5,15.0 };
	times.assign(timesArray, timesArray + numImages);

	//文件名列表
	//指针数组
	static const char* filenames[] = { "img_0.0333.jpg","img_0.25.jpg","img_2.5.jpg","img_15.jpg" };
	for (int i = 0; i < numImages; i++) {
		Mat im = imread(filenames[i]);
		images.push_back(im);
	}
}





int main() {
	vector<Mat> images;
	vector<float> times;
	readImagesAndTimes(images, times);

	//利用中值阈值图(MTB)进行对齐
	Ptr<AlignMTB> alignMTB = createAlignMTB();
	alignMTB->process(images, images);

	//恢复相机响应函数
	Mat responce;
	Ptr<CalibrateDebevec> calibratedebevec = createCalibrateDebevec();
	calibratedebevec->process(images, responce, times);
	
	//融合
	Mat hdr;
	Ptr<MergeDebevec> mergedebevec = createMergeDebevec();
	mergedebevec->process(images, hdr, times, responce);

	
	//调色
	Mat res;
	Ptr<TonemapReinhard> reinhard = createTonemapReinhard(1.5,0,0,0);
	reinhard->process(hdr, res);
	imwrite("result.jpg", res*255);


	//imwrite("hdr.hdr", hdr);
	//imshow("hdr_align", hdr);
	//waitKey(0);
	return 0;
}

转自:Opencv学习笔记 高动态范围 (HDR) 成像_坐望云起的博客-CSDN博客_图像动态范围

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值