灰度图&图像各种互转
-
参考
-
灰度图概念
灰度图是一种图像表示方法(在计算机中的表示方法),其中像素的亮度值表示该像素在图像中的颜色信息,而色彩信息则被忽略。
在灰度图中,每个像素只有一个亮度值,通常用一个8位或16位的整数表示,范围从0(黑色)到255(白色)或0到65535(对于16位灰度图)。由于只有亮度信息,因此灰度图无法表示颜色,只能表示图像的亮度和对比度。
灰度图在图像处理中非常常见,因为它们可以简化图像处理算法,并且可以减少计算量和存储需求。例如,在图像二值化中,灰度图可以被转换为二值图像,其中每个像素只有黑色或白色两种可能的值。这种转换可以大大简化图像分析和处理任务,如边缘检测、图像分割等; -
torchvision.transforms
中转灰度图transforms.Grayscale(num_output_channels=3) 是 PyTorch 的 torchvision.transforms 模块中的一个转换操作,它将输入图像转换为灰度图。这个操作接受的输入可以是 PIL 图像或者一个浮点型的 torch.Tensor。
- PIL 图像:如果你的输入是 PIL 图像,它可以是 RGB 格式或者已经是灰度图。transforms.Grayscale(num_output_channels=3) 会将输入的 PIL 图像转换为一个具有指定通道数的灰度图。num_output_channels=3 意味着输出图像将是一个三通道的灰度图,每个通道的值都是相同的,即标准的灰度图像表示。
- 浮点型 torch.Tensor:如果你的输入是一个 torch.Tensor,它应该是一个具有 (C, H, W) 形状的张量,其中 C 是通道数,H 是高度,W 是宽度。对于张量输入,transforms.Grayscale(num_output_channels=3) 也会将其转换为一个三通道的灰度图。
当 num_output_channels=3 时,即使输入是单通道的灰度图,输出也会是一个三通道的灰度图。每个通道的像素值都是相同的,都是从输入图像计算得到的灰度值。
如果输入是三通道的 RGB 图像,这个转换操作会计算一个加权平均值来生成一个单一的灰度值,然后将这个值复制到三个通道中。 - transforms.Grayscale(num_output_channels=1), 则为正常操作,将rgb图像转为单通道灰度图, 对应的
normalize
=transform.Normalize(mean[0.0], std=[1.0]) 要适应为单通道的值;
-
图像格式转换
-
PIL 格式(H, W, C)
PIL 图像对象包含多种属性和方法,其中一些重要的包括:
模式(Mode):表示图像的颜色模式,常见的模式包括 “RGB”、“RGBA”、“L”(灰度)、“CMYK” 等。
尺寸(Size):图像的宽度和高度,以像素为单位。
数据(Data):图像的原始像素数据,通常以字节形式存储。默认模式下PIL会自动检测图像模式,如果是灰度图则为’L’模式,灰度图读出的结果就是单通道;
img= img.convert('RGB')
是将可能是读取的灰度图转为RGB,这里明显将通道数增加到 3, 需要注意从opencv转PIL中的cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB), 是有区别的;from PIL import Image image = Image.open(img_file) # 获取图像的模式 mode = image.mode print(f"图像模式: {mode}") # 获取图像的尺寸 size = image.size print(f"图像尺寸: {size}") # 输出格式为 (宽度, 高度) # 获取图像的宽度和高度 width, height = image.size print(f"宽度: {width}, 高度: {height}") # 如果需要,可以获取图像的通道数 if mode == 'RGB': channels = 3 elif mode == 'RGBA': channels = 4 elif mode == 'L': channels = 1 else: channels = None print(f"通道数: {channels}") # 格式转换,如RGB 转L image = image.convert('L')
-
opencv 格式:(H, W, C)
默认打开的是BGR格式,
-
输入到CNN中的tensor格式:(C, H, W)
-
opencv 转PIL;
cv2读取图像模型是BGR格式array数组,因此在转PIL格式前先要转为RGB格式;
# 读取图像(OpenCV 默认使用 BGR 格式) opencv_image = cv2.imread('path_to_your_image.jpg') opencv_image = cv2.cvtColor(opencv_image, cv2.COLOR_BGR2RGB) # 将 OpenCV 图像(NumPy 数组)转换为 RGB pil_image = Image.fromarray(opencv_image )
-
PIL转numpy&& opencv:
# 将 PIL 图像转换为 NumPy 数组 img_array = np.array(img)
-
PIL转pytorch tensor
import torch import torchvision.transforms as transforms # 定义转换操作:从 PIL 图像到 PyTorch 张量 transform = transforms.Compose([ transforms.ToTensor() # 将Image格式图像转为tensor,并/255 操作,归一化为float32 ]) # 打开图像 img = Image.open('path_to_your_image.jpg') # 应用转换 img_tensor = transform(img)
-
numpy转tensor
从 PIL/NumPy (H, W, C) 转换为 PyTorch (C, H, W);
# 将 NumPy 数组转换为 PyTorch 张量并调整维度顺序 img_tensor = torch.from_numpy(np.array(img)).permute(2, 0, 1)
-