Opencv计算相机响应函数(Camera Response Function)与Radiance 您所在的位置:网站首页 相机的exp Opencv计算相机响应函数(Camera Response Function)与Radiance

Opencv计算相机响应函数(Camera Response Function)与Radiance

2024-01-20 21:54| 来源: 网络整理| 查看: 265

本文主要用于记录自己在学习CRF过程中遇到的一些问题。

两个论文截图

在这里插入图片描述 在这里插入图片描述

CRF模型

B = f ( V ( t ⋅ L ) ) B=f(V( t\cdot L)) B=f(V(t⋅L)) 其中 B B B为相机灰度值brightness, L L L为环境中radiance, t t t为曝光时间, V V V为相机镜头参数, f f f为相机响应函数CRF。

有些论文中认为相机镜头参数是线性的不考虑,但有些考虑了衰减即靠近图像边缘亮度会暗一些,但没有看到二者同时计算的,如果同时计算两个非线性的函数,我觉得可能会有不确定性,在这里还请教一下了解的朋友。

控制相机曝光

首先要确定其中曝光时长 t t t。由于采用的是V4L2的USB相机,调整过程中遇到了一些列问题。详细记录在这里:V4L相机使用记录。

利用OpenCV获取HDR图像

首先了解如何用多张图合成HDR图像,主要参考:learnopencv网站

伪代码:

// load images & exposure time images.push_back(src); const vector times = {1/30.0f, 0.25, 2.5, 15.0}; // 计算CRF Mat responseDebevec; // response if a CV_32FC3 value. Ptr calibrateDebevec = createCalibrateDebevec(); calibrateDebevec->process(images, responseDebevec, times); // 采用Debevec方法计算HDR Mat hdr; Ptr mergeDebevec = createMergeDebevec(); mergeDebevec->process(images, hdr, times, responseDebevec); // map to ldr for draw/showing. Mat ldr; Ptr tonemap = createTonemap(2.2f); // Debevec算法需要经过一步色调映射 tonemap->process(hdr, ldr); // 采用Mertens方法计算HDR(不需要已知曝光参数) Ptr mergeMertens = createMergeMertens(); // Mertens算法不要 Mat mm_img; mergeMertens->process(images, mm_img);

注意:所有数据格式采用float或32FC1/32FC3格式,这个坑了我半天。

计算CRF

上面出现的responseDebevec就是CRF。这里把尝试把它画出来:

const int width_scale = 3, height_scale = 20; const int width = 255 * width_scale, height = 40 * height_scale; Mat img = Mat::zeros(Size(width, height), CV_8UC3); Point b_old = Point(0, height); Point g_old = Point(0, height); Point r_old = Point(0, height); for (int i = 0; i // Model equation: a x exp(b x intensity) - 1 = irradiance; const float maxIrradiance = 1; // normalized to 1. const float a = 1.0f; // given a value; const float b = (log(maxIrradiance + 1) - log(a)) / 255; return a * exp(b * intensity) - 1; } Mat testImg; cvtColor(images[1], testImg, COLOR_BGR2GRAY); assert(testImg.type() == CV_8UC1); imshow("test", testImg); Mat irradiance = Mat::zeros(testImg.size(), CV_32FC1); for(int i=0; i float value = testImg.at(i, j); irradiance.at(i, j) = calInverseCRF(value); } } const double exposureTime = times[1]; // not used now. Mat intensity = irradiance / exposureTime; normalize(intensity, intensity, 1.0, 0.0, NORM_MINMAX); imshow("dst", intensity);

结果: 在这里插入图片描述

遇到的问题总结 CRF是三通道的,我尝试转成灰度图算一个CRF,计算的总是错误。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有