1、高动态范围成像
- 高动态范围(HDR、High-Dynamic-Range)成像
- 例程
#include <iostream>
#include <opencv2/photo.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
vector<Mat> images;
vector<float> times;
//加载图像和曝光度
Mat img1 = imread("test60.jpg");
Mat img2 = imread("test30.jpg");
Mat img3 = imread("test15.jpg");
images.push_back(img1);
images.push_back(img2);
images.push_back(img3);
times.push_back((float)1 / 60);
times.push_back((float)1 / 30);
times.push_back((float)1 / 15); //都是快门时间
//估计相机响应
Mat response;
Ptr<CalibrateDebevec> calibrate = createCalibrateDebevec();
calibrate->process(images, response, times);
//显示所估计的相机响应函数
cout << response;
//创建和写HDR图像
Mat hdr;
Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
merge_debevec->process(images, hdr, times, response);
imwrite("hdr.jpg", hdr);
waitKey();
return 0;
}
- 显示高动态范围图像的时,可能会丢失信息。所以将其强度映射到一组有限的值是必要的。就是色调映射
Mat ldr;
Ptr<TonemapDurand> tonemap=createTonemapDurand(2.2f);
tonemap->process(hdr,ldr);
ldr=ldr*255;//ldr在0~1之间
- 多种曝光图片应该是静态的,摄像机也应该是静态的。所以需要对准图像。
vector<Mat> images_(images);
Ptr<AlignMTB> align=createAlignMTB(4);//4表示最多4个像素的位移
align->process(images_,images);
2、其他
- 脱色:decolor函数。原先的转换灰度图可能产生损失了原图像对比度的图像,因为两种不同的颜色最终可能被映射为同一灰度值。
- 无缝合成函数:seamlessClone()
3、参考资料
《OpenCV 图像处理》Gloria Bueno Garcia、Oscar Deniz Suarez、Jose Luis Espinosa Aranda著,刘冰 翻译,机械工业出版社出版,2016年11月