【灰度图&图像间转换】

灰度图&图像各种互转
  • 参考
  • 灰度图概念

    灰度图是一种图像表示方法(在计算机中的表示方法),其中像素的亮度值表示该像素在图像中的颜色信息,而色彩信息则被忽略。
    在灰度图中,每个像素只有一个亮度值,通常用一个8位或16位的整数表示,范围从0(黑色)到255(白色)或0到65535(对于16位灰度图)。由于只有亮度信息,因此灰度图无法表示颜色,只能表示图像的亮度和对比度。
    灰度图在图像处理中非常常见,因为它们可以简化图像处理算法,并且可以减少计算量和存储需求。例如,在图像二值化中,灰度图可以被转换为二值图像,其中每个像素只有黑色或白色两种可能的值。这种转换可以大大简化图像分析和处理任务,如边缘检测、图像分割等;

  • torchvision.transforms中转灰度图

    transforms.Grayscale(num_output_channels=3) 是 PyTorch 的 torchvision.transforms 模块中的一个转换操作,它将输入图像转换为灰度图。这个操作接受的输入可以是 PIL 图像或者一个浮点型的 torch.Tensor。

    1. PIL 图像:如果你的输入是 PIL 图像,它可以是 RGB 格式或者已经是灰度图。transforms.Grayscale(num_output_channels=3) 会将输入的 PIL 图像转换为一个具有指定通道数的灰度图。num_output_channels=3 意味着输出图像将是一个三通道的灰度图,每个通道的值都是相同的,即标准的灰度图像表示。
    2. 浮点型 torch.Tensor:如果你的输入是一个 torch.Tensor,它应该是一个具有 (C, H, W) 形状的张量,其中 C 是通道数,H 是高度,W 是宽度。对于张量输入,transforms.Grayscale(num_output_channels=3) 也会将其转换为一个三通道的灰度图。
      当 num_output_channels=3 时,即使输入是单通道的灰度图,输出也会是一个三通道的灰度图。每个通道的像素值都是相同的,都是从输入图像计算得到的灰度值。
      如果输入是三通道的 RGB 图像,这个转换操作会计算一个加权平均值来生成一个单一的灰度值,然后将这个值复制到三个通道中。
    3. transforms.Grayscale(num_output_channels=1), 则为正常操作,将rgb图像转为单通道灰度图, 对应的normalize=transform.Normalize(mean[0.0], std=[1.0]) 要适应为单通道的值;
  • 图像格式转换
    1. 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')
      
    2. opencv 格式:(H, W, C)

      默认打开的是BGR格式,

    3. 输入到CNN中的tensor格式:(C, H, W)

    4. 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 )
      
    5. PIL转numpy&& opencv:

      # 将 PIL 图像转换为 NumPy 数组
      img_array = np.array(img)
      
    6. 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)
      
    7. 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)
      
  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stsdddd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值