pytorch plt.imsave()将灰度图像保存为RGBA,使用cv2应用相同的变换会得到不同的图像

1l5u6lss  于 2023-08-05  发布在  其他
关注(0)|答案(1)|浏览(150)
plt.imsave(f"{save_path}/img.png", spectrogram[0]) # Saves as 4 channel (RGBA I assume)
spectrogram1 = torchvision.io.read_image(f"{save_path}/img.png", io.ImageReadMode.GRAY)[0].float()
spectrogram1 = torch.stack([spectrogram1, spectrogram1])

字符串
频谱图是具有范围从-80到+50的值的双通道图像(形状=(2,X))。读取文件spectrogram 1的范围为0到255,但绘制时看起来相同。

spectrogram2 = cv2.cvtColor(spectrogram[0], cv2.COLOR_GRAY2RGBA)
spectrogram2 = cv2.cvtColor(spectrogram2, cv2.COLOR_RGBA2GRAY)
spectrogram2 = torch.stack([spectrogram2, spectrogram2])


光谱图2具有与光谱图1相同的范围,并且看起来也非常相似。但不知何故是非常不同的,因为在像spectrogram 1这样的图像上训练的分类模型在像spectrogram 2这样的图像上给出随机输出。
为什么声谱图1和2不同?另外,我如何在推理过程中执行与spectrogram 1完全相同的转换,而不保存会增加大量IO开销的文件。

vm0i2vca

vm0i2vca1#

您不应该使用pyplot.imsave来存储灰度图像。参见the documentation
如果您想将单通道图像保存为灰度,请直接使用图像I/O库(如pillow、tifffile或imageio)。
pyplot.imsave首先最小-最大拉伸图像,然后应用viridis颜色Map。这些步骤可以在Matplotlib中通过适当的函数调用重现,而无需保存到文件中。应该是这样的:

cm = matplotlib.pyplot.get_cmap() # default color map, viridis
norm = matplotlib.colors.Normalize()
rgb = cm(norm(spectrogram[0]))

字符串
当您将PNG图像读取为灰度图像时,viridis颜色Map表的颜色将以文档中未指定的某种方式转换为灰度,您必须阅读源代码以了解应用了什么转换。您可以尝试将OpenCV与cv2.COLOR_RGB2GRAY一起使用,看看是否匹配。但更好的办法是在torchvision中查找颜色约定函数。

相关问题