Python 画像の均一サイズと変換チャネル
1. なぜ写真と変換チャネルのサイズを統一するのですか?
- 均一サイズ画像
- 深層学習では、ほとんどのモデル入力は同じサイズの画像を必要としますが、元のデータ画像のサイズは均一ではないため、この操作が必要です
- チャンネルを変換する
- 深層学習ではモデルの入力画像のチャンネルが必要となるため、モデルに合わせてチャンネルを変換する必要があります。
2. 一般的な画像チャンネルとモードの種類
- 画像チャンネル
- 画像内のピクセルごとの色を表すコンポーネントの数を指します。
- 画像モード
- 画像のチャネル タイプとピクセル深度を指します。枕ライブラリでは、各画像にパターンがあります
- モードは、チャネルの数と各チャネルのビット深度を示します。
2.1 チャンネルの種類
-
グレースケール画像
- グレースケール画像にはチャネルが 1 つだけあります。
- 各ピクセルは
8位字节
1 で表され、その値の範囲は通常 であり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位
表します。は、最も一般的な画像モードの 1 つです。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