首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV为什么设置Mat等于小于1的小数不会导致Mat中的所有值变为0?

OpenCV为什么设置Mat等于小于1的小数不会导致Mat中的所有值变为0?
EN

Stack Overflow用户
提问于 2018-01-19 06:39:05
回答 1查看 153关注 0票数 0

我需要帮助弄清楚OpenCV是如何设置一个等于某物的矩阵的。

我有一个名为“亮度”的8位Mat,我想要色调图。下面是为我完成这一任务的工作代码,K是常量450。

代码语言:javascript
复制
cv::cvtColor(radiance, radiance, CV_BGR2XYZ);
radiance = (K * radiance)/(1 + (K * radiance));
cv::cvtColor(radiance, radiance, CV_XYZ2BGR);`

这个看起来不应该工作,但它确实工作。它将创建一个完整的色调映射图像,看上去很棒。但是,如果尝试对单个像素执行此方法,则它们会变成介于0到1之间的小数,从而截断为0。这里有一个例子-

代码语言:javascript
复制
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";

它的输出正是我所期望的。

代码语言:javascript
复制
0

我理解为什么第二个代码片段打印出一个零,但是第一部分中发生了什么,它可以正确地对图像进行色调映射,以及我如何在单个像素级别上重新创建这个值呢?

EN

回答 1

Stack Overflow用户

发布于 2018-01-19 07:36:56

你就不能把亮度定义为浮子矩阵吗?

代码语言:javascript
复制
Mat radiance(m, n, DataType<float>::type);

这样你就可以得到一个浮子

代码语言:javascript
复制
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";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48335442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档