动态范围:动态范围值图像最大亮度与最小亮度比值,低动态范围图像动态范围大致在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;
}