我需要帮助弄清楚OpenCV如何处理设置等于某事的矩阵。
我有一个名为Radiance的8位垫,我想要调色图。以下是为我完成此操作的代码,其中K为常量450。
cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
radiance = (K * radiance)/(1 + (K * radiance));
cv::cvtColor(radiance, radiance, CV_XYZ2BGR);`
似乎不应该起作用 ,但确实如此。它将创建一个看起来很棒的完全色调映射图像。但是,如果您尝试对单个像素执行此方法,它们将变为0到1之间的小数,其截断为0.以下是此示例 -
cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
int x = radiance.at<cv::Vec3b>(500, 500)[0];
x = (K * x)/(1 + (K * x));
std::cout << x << "\n";
这是我期望的输出
0
我理解为什么第二段代码打印出零,但是第一部分中发生了什么,它允许它正确地映射图像,以及如何在单个像素级别重新创建它?
答案 0 :(得分:1)
难道你不能将辐射定义为浮点矩阵吗?
Mat radiance(m, n, DataType<float>::type);
所以你可以得到一个浮动
cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
float x = radiance.at<cv::Vec3b>(500, 500)[0];
x = (K*x)/(1 + (K*x));
std::cout << x << "\n";