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开销的文件。
1条答案
按热度按时间vm0i2vca1#
您不应该使用
pyplot.imsave
来存储灰度图像。参见the documentation:如果您想将单通道图像保存为灰度,请直接使用图像I/O库(如pillow、tifffile或imageio)。
pyplot.imsave
首先最小-最大拉伸图像,然后应用viridis颜色Map。这些步骤可以在Matplotlib中通过适当的函数调用重现,而无需保存到文件中。应该是这样的:字符串
当您将PNG图像读取为灰度图像时,viridis颜色Map表的颜色将以文档中未指定的某种方式转换为灰度,您必须阅读源代码以了解应用了什么转换。您可以尝试将OpenCV与
cv2.COLOR_RGB2GRAY
一起使用,看看是否匹配。但更好的办法是在torchvision
中查找颜色约定函数。