c++ - 将 exr/pfm 保存到位图 CImg

标签 c++ image image-processing visual-c++ cimg

我正在尝试将一些位图文件转换为自定义图像(exrpfm 等),然后再转换回位图:

CImg<float> image(_T("D:\\Temp\\test.bmp"));
image.normalize(0.0, 1.0);
image.save_exr(_T("D:\\Temp\\test.exr"));

一切正常(.pfm 文件也是如此),我的意思是 exr 文件没问题,pfm 文件也是如此。

但是当我尝试将此 exrpfm 文件转换回位图时:

CImg<float> image;
image.load_exr(_T("D:\\Temp\\test.exr"));    // image.load_pfm(_T("D:\\Tempx\\test.pfm"));
image.save_bmp(_T("D:\\Temp\\test2.bmp"));

结果,test2.bmp为黑色。完全的。为什么 ?我做错了什么?

最佳答案

一些图像格式支持保存为 float ,但大多数格式保存为无符号 8 位整数(或 uint8),这意味着正常的图像值是从 0 到 255。如果你试图保存一个由从 0 开始的 float 组成的数组将 1 转换为不支持 float 的格式,您的值很可能会转换为整数。当您使用大多数图像查看软件显示图像时,它会显得全黑,因为 0 是黑色,1 几乎是黑色。

很可能当您将图像保存为位图时,它试图将值转换为 uint8 但未正确缩放。您可以通过将 0 和 1 之间的标准化值乘以 255 来解决此问题。img = int(img*255) 或使用 numpy img = (img*255).astype(np.uint8)

也有可能您的保存函数能够以位图格式保存浮点值。但是,您的图像查看软件可能不知道如何查看/显示 float 图像。也许在每行代码之间使用一些 imshow 函数(matplotlib.pyplot 可以轻松显示浮点灰度数组)来检查数组是否与您期望的一致。

关于c++ - 将 exr/pfm 保存到位图 CImg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59154933/

相关文章:

c++ - SDL 加载我的图像搞砸了

c++ - 使用 execv 从 C++ 代码执行 Linux 脚本失败

php - Laravel 应用存储图片加载失败并重定向到 404

sql - 将图像插入 SQL Server

android - 如何从 Android 上的位图中获取 RGB 值?

c++ - OpenEXR 图像加载

c++ - 将数组作为参数传递

c++ - 检查 C++ 中是否只有一个字符串变量不是 nullptr

c++ - 错误: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]

jquery - 如果图像未悬停,则隐藏 div