将只有0,2两个值的Tensor保存为png图片后,再重新读像素值,原本为2的像素值全都变成了小于1的数,请问是怎么回事。目的是标记语义分割的class,这个问题一直没解决。请求帮助。
从给出的代码和问题描述来看,出现了像素值转换错误的问题。在重新读取图片后,原本为2的像素值变成了小于1的数。经过分析,可以看出问题出在将像素值转换为0和2的代码段上。
reloaded_image = np.where(reloaded_image < 1, 0, 2)
这段代码的逻辑是将重新读取的灰度图像中小于1的像素值设置为0,大于等于1的像素值设置为2。然而,由于之前保存为PNG图片时使用了image_tensor.numpy()
来将张量转换为numpy数组,而在这个过程中,原本是int型的像素值被转换为了float型,所以在重新读取图片后,像素值都变成了小于1的浮点数。
解决这个问题的方法是在保存为PNG图片时,将像素值转换为整数型,以保持一致性。修改代码如下:
import torch
from PIL import Image
# 假设tensor为image_tensor
image_tensor = torch.tensor([[2, 0, 0],
[0, 0, 2]])
# 将tensor保存为PNG图片
image_tensor = image_tensor.byte()
image = Image.fromarray(image_tensor.numpy().astype(np.uint8), mode='L')
image.save('image.png')
# 重新读取图片
# 这里使用OpenCV库读取图片
import cv2
import numpy as np
reloaded_image = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)
# 将像素值转换为0和2
reloaded_image = np.where(reloaded_image < 1, 0, 2)
修改后的代码保证了在重新读取图片时像素值的类型是整数类型,这样就可以正确地将像素值转换为0和2了。