python图片统一大小及转换通道

1.为什么统一大小图片及转换通道?

  • 统一大小图片
    • 在深度学习中,模型输入大多数都需要相同大小图片,但是我们原始数据图片大小是不统一的,所以需要此操作
  • 转换通道
    • 在深度学习中,模型的输入图片的通道是有要求的,所以要根据模型来转换通道

2. 常见的图片通道和模式类型

  • 图片通道
    • 指的是图像中每个像素表示颜色的分量数。
  • 图像模式
    • 指图像的通道类型像素深度。 在Pillow库中,每个图像都有一个模式
    • 该模式表示有多少通道以及每个通道的位深度。

2.1 通道类型

  • 灰度图像

    • 灰度图像只有一个通道。
    • 每个像素用一个8位字节表示,其取值范围通常是0-255,表示像素的不同灰度值
    • 值越高,像素越明亮,值越低,像素越暗
      import numpy as np
      from PIL import Image
      # 方式一
      # 打开彩色图像并将其转换为灰度图像
      img = Image.open('a.jpg').convert('L')
      # 将灰度图像转换为numpy数组
      gray_array = np.array(img)
      # 保存灰度图像
      Image.fromarray(gray_array).save('gray_image.jpg')
      
      # 方式二 将图像载入到一个numpy数组中
      
      # 打开彩色图像并将其转换为灰度图像
      img = Image.open('color_image.jpg').convert('L')
      # 将灰度图像转换为numpy数组
      gray_array = np.array(img)
      # 保存灰度图像
      Image.fromarray(gray_array).save('gray_image.jpg')
      
  • RGB图像

    • RGB图像有三个通道,分别代表红色、绿色和蓝色
    • 对于每个像素,每个通道上的值都是8位,其取值范围通常是0-255
    • 通过组合不同的红色、绿色和蓝色值,可以表示形成不同颜色的像素。
      import numpy as np
      from PIL import Image
      # 方式一
      # 打开灰度图像并将其转换为三通道的彩色图像
      img = Image.open('gray_image.jpg').convert('RGB')
      
      # 保存三通道彩色图像
      img.save('color_image.jpg')
      
      # 方式二 将图像载入到一个numpy数组中
      
      # 打开灰度图像并将其转换为三通道的彩色图像
      gray_img = Image.open('gray_image.jpg')
      color_array = np.array(gray_img)
      color_array = np.stack((color_array,) * 3, axis=-1)
      
      # 保存三通道彩色图像
      Image.fromarray(color_array).save('color_image.jpg')
      
  • RGBA图像

    • RGBA图像有四个通道,分别代表红色、绿色、蓝色和透明度(alpha)
    • 每个像素上的值仍然是8位,其取值范围为0-255,其中透明度值为0表示完全透明,255表示完全不透明。
    • 通常在处理图像时,透明度通道用于指定像素的不透明度或混合多个图像的透明度。
      import numpy as np
      from PIL import Image
      # 方式一
      # 打开图像并添加alpha通道
      img = Image.open('image.jpg').convert('RGBA')
      
      # 保存4通道图像
      img.save('4_channel_image.png')
      
      # 方式二 将图像载入到一个numpy数组中
      
      # 打开图像并添加alpha通道
      img = Image.open('image.jpg').convert('RGBA')
      
      # 将4通道图像转换为numpy数组
      img_array = np.array(img)
      
      # 保存4通道图像
      Image.fromarray(img_array).save('4_channel_image.png')
      

2.2 模式类型

  • 1(1位/像素单色)
    • 此模式使用1位深度来表示每个像素的灰度值,其中0表示黑色1表示白色
  • L(8位/像素单色)
    • 此模式使用8位深度来表示每个像素的灰度值,其中0表示黑色255表示白色
  • P(8位/像素彩色)
    • 此模式是一种调色板图像,其中调色板以一种特定的方式存储在图像文件中。在P模式中,每个像素由一个8位索引值表示,该索引指向存储在调色板中的相应颜色。
  • RGB(24位/像素彩色)
    • 此模式使用24位深度来表示红色、绿色和蓝色通道中的每个像素值,分别为8位RGB模式是最常见的图像模式之一。
  • RGBA(32位/像素彩色)
    • 此模式与RGB模式类似,但还具有一个alpha通道,该通道存储每个像素的不透明度值
  • CMYK(32位/像素彩色)
    • 此模式使用32位深度来表示青色、品红、黄色和黑色通道中的每个像素值,分别为8位。这种模式通常用于印刷和出版业中。
  • 查看图片模式代码
    from PIL import Image
    
    img = Image.open('image.jpg')
    print(img.mode)
    

3.批量实现图片统一大小及转换通道代码

3.1 安装相关库

pip install numpy==1.21.5
pip install pillow==9.4.0 -i https://pypi.douban.com/simple/

3.2 代码实现

import os
from PIL import Image
import numpy as np
size_w,size_h=128,128 # 统一大小的宽高

#提取目录下所有图片,更改尺寸后保存到另一目录
old_path=' ' # 原图片地址
new_path=' '  # 统一图片大小地址

for i in os.listdir(old_path):
    try:
        # 打开图像并将其调整为size_w x size_h大小
        old=os.path.join(old_path,i)
        new=os.path.join(new_path,i)
        img = Image.open(old).resize((size_w, size_h))
        # 将灰度图像转换为数组,并调整形状为(size_w, size_h,3)
        img_array  = np.array(img).reshape((size_w, size_h,3))
        # 保存形状为(size_w, size_h,3)的数组为图像
        img_new  = Image.fromarray(img_array, mode='RGB')
        print(old,new)
        img_new.save(new)

    except Exception as e:
        print(old, e) 
        continue

猜你喜欢

转载自blog.csdn.net/m0_46926492/article/details/131087833