在读取一张图片,然后不做任何处理直接保存这张图片的时候,如果出现了颜色失真(如下,非常简单的代码),则很有可能是我们没有正确认识图片的颜色通道导致的。
import cv2
from torchvision.utils import save_image
from torchvision import transforms
image = cv2.imread('../gt/21.png')
to_tensor = transforms.ToTensor()
image = to_tensor(image)
save_image(image,'./a.png')
上面的代码使用opencv读取一张图片,然后直接把这张图片保存下来,结果如下图:左边是原图,右边是保存下来的图片,可以发现明显颜色不同了。
在自己研究torchvision下的utils下的save_image()函数的时候在这个地方卡了很久。为什么会出现这个问题呢?
其实是因为cv2(opencv)读取图片的形状和颜色通道的顺序的和正常的RGB不同的原因导致的,cv2读取的图片的形状为:(height, width, channels)。其中颜色通道默认为BGR,而不是RGB,所以在保存的时候就出现了问题。
总结:如果我们使用opencv(cv2)读取一张彩色图片,转化为张量或者是保存图片之前需要把通道顺序转化为RGB。
如果使用opencv(cv2)读取和保存图片,又想使用torchvision下的utils下的save_image方法的话,则正确的代码为:
import cv2
from torchvision.utils import save_image
from torchvision import transforms
image = cv2.imread('../gt/21.png')
image = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
to_tensor = transforms.ToTensor()
image = to_tensor(image)
save_image(image,'./a.png')