保存 exr/pfm 到位图 CImg
Save exr/pfm to bitmap CImg
我正在尝试将一些位图文件转换为自定义图像(exr、pfm,等等),然后返回到位图:
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 文件.
但是当这个 exr 或 pfm 文件我试图转换回位图时:
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是黑色的。完全的。为什么 ?我做错了什么?
一些图像格式支持保存为浮点数,但大多数格式保存为无符号 8 位整数(或 uint8),这意味着正常的图像值是从 0 到 255。如果您尝试保存由浮点数组成的数组从 0 到 1 转换为不支持浮点数的格式,您的值很可能会转换为整数。当您使用大多数图像查看软件显示图像时,它会显示为全黑,因为 0 是黑色,1 几乎是黑色。
很可能当您将图像保存为位图时,它正在尝试将值转换为 uint8 但未正确缩放。您可以通过将 0 和 1 之间的标准化值乘以 255 来解决此问题。img = int(img*255)
或使用 numpy img = (img*255).astype(np.uint8)
.
也有可能您的保存函数能够以某种方式以位图格式保存浮点值。但是,您的图像查看软件可能不知道如何 view/display 浮动图像。也许在每行代码之间使用一些 imshow 函数(matplotlib.pyplot 可以轻松显示浮点灰度数组)来检查数组是否与您期望的一致。
我正在尝试将一些位图文件转换为自定义图像(exr、pfm,等等),然后返回到位图:
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 文件.
但是当这个 exr 或 pfm 文件我试图转换回位图时:
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是黑色的。完全的。为什么 ?我做错了什么?
一些图像格式支持保存为浮点数,但大多数格式保存为无符号 8 位整数(或 uint8),这意味着正常的图像值是从 0 到 255。如果您尝试保存由浮点数组成的数组从 0 到 1 转换为不支持浮点数的格式,您的值很可能会转换为整数。当您使用大多数图像查看软件显示图像时,它会显示为全黑,因为 0 是黑色,1 几乎是黑色。
很可能当您将图像保存为位图时,它正在尝试将值转换为 uint8 但未正确缩放。您可以通过将 0 和 1 之间的标准化值乘以 255 来解决此问题。img = int(img*255)
或使用 numpy img = (img*255).astype(np.uint8)
.
也有可能您的保存函数能够以某种方式以位图格式保存浮点值。但是,您的图像查看软件可能不知道如何 view/display 浮动图像。也许在每行代码之间使用一些 imshow 函数(matplotlib.pyplot 可以轻松显示浮点灰度数组)来检查数组是否与您期望的一致。