OpenCV为什么设置Mat等于小于1的十进制不会导致Mat中的所有值都变为0?

时间:2018-01-19 06:39:05

标签: c++ opencv opencv3.1

我需要帮助弄清楚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

我理解为什么第二段代码打印出零,但是第一部分中发生了什么,它允许它正确地映射图像,以及如何在单个像素级别重新创建它?

1 个答案:

答案 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";