将灰度蒙版图像转换为RGB,同时将一个灰度更改为特定颜色

问题描述 投票:0回答:1

使用 torch 和 matplotlib 时,我能够更改灰度颜色 #50,例如为红色。但是,只能通过保存中间的图像来实现。 不保存图片怎么解决? 我很抱歉问了这个简单的问题,但我是 torch、torchvision 和 matplotlib 的新手。

这是我的代码,首先保存图像:

import torch
import matplotlib.pyplot as plt
from torchvision.io import read_image 

mask = read_image("A_mask.png")

mask_np = mask.numpy()
print(mask_np.shape)    #(1, 438, 567)
mask_np[mask_np == 4] = 50
output_image = torch.tensor(mask_np)

from torchvision import transforms
im = transforms.ToPILImage()(output_image).convert("RGB")
im.save("A-Mask-Colored-By-Hand.png")

然后加载它:

from torchvision import transforms

m = read_image("A-Mask-Colored-By-Hand.png")
#print(type(m))  # <class 'torch.Tensor'>

这是我的问题,如何将“im”转换为预期格式,而不是阅读它。此代码块是我尝试过的但不起作用: 因此,注释掉这个块......可以工作,但通过再次保存和加载并不是最佳选择。

from PIL import Image
#tensor_image = im.permute(1,2,0) # #
tensor_image = im
pil_image = Image.fromarray((tensor_image.numpy() * 255).astype("uint8")) 
# here it stops, throwing an AttributeError: 'Image' object has no attribute 'numpy'

此代码块有效:

m = pil_image
print(m.shape)    #(3, 438, 567)
m = m.numpy()
print(m.shape)    #(3, 438, 567)

cgrey = 50 # grey #50 > into red #255
mask = (m[0]==cgrey) & (m[1]==cgrey) & (m[2]==cgrey)
m[0][mask] = 255
m[1][mask] = 0
m[2][mask] = 0

output_image = torch.tensor(m)

from torchvision import transforms
im = transforms.ToPILImage()(output_image).convert("RGB")
print(im) # tensor
im.save("A-Mask-Colored-RGB.png")

提前致谢!

python matplotlib pytorch torchvision
1个回答
0
投票

同时我用这个函数解决了这个问题:

import numpy as np 
def pil_to_tensor(images): 
images = np.array(images) 
images = torch.from_numpy(images.transpose(2, 0, 1)) 
return images 

并且可以删除包括保存图像在内的两个代码块。相反,调用该函数:

pil_image = pil_to_tensor(im)
© www.soinside.com 2019 - 2024. All rights reserved.