OpenCV 为什么将垫子设置为小于 1 的小数不会导致垫中的所有值都变为 0?

  • 本文关键字:小数 设置 小于 OpenCV 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

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

你不能把辐射度定义为浮点矩阵吗?

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

最新更新