《OpenCV图像处理》 第六章 计算摄影学

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月

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81275187