Shikata Ga Nai

Private? There is no such things.

19. 画像データの分析① 〜画像データの読み込みと前処理〜

Hello there, ('ω')ノ

画像データの読み込みと表示
リサイズ・グレースケール変換
データ拡張(Data Augmentation)
画像の数値ベクトル化(配列変換)


📌 1. 画像データとは?

画像データは、ピクセル(画素) の集まりです。
カラー画像(RGB)の場合、各ピクセルは (R, G, B) の3つの数値 で表されます。

ピクセル位置 赤(R) 緑(G) 青(B)
(0,0) 255 0 0 | ← 赤色
(1,0) 0 255 0 | ← 緑色
(2,0) 0 0 255 | ← 青色

画像は「高さ × 幅 × 色(3チャンネル)」の数値データ!
モノクロ画像なら「高さ × 幅」の2次元データ!

画像を数値データとして処理できるように前処理する!


📌 2. 画像データの読み込み

まずは、Pythonの OpenCV(cv2)PIL(Pillow) を使って、画像データを読み込みます。

✅ (1) OpenCV を使った画像の読み込み

import cv2
import matplotlib.pyplot as plt

# 画像を読み込む
image = cv2.imread("/kaggle/input/honey-bee-annotated-images/bee_imgs/004_138.png")

# BGR形式をRGB形式に変換(OpenCVはBGRで読み込むため)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# 画像を表示
plt.imshow(image)
plt.axis("off")  # 軸を非表示にする
plt.show()

OpenCV(cv2)は、画像処理に特化したライブラリ!
OpenCVはBGR(青・緑・赤)形式で画像を読み込むので、RGB変換が必要!


✅ (2) PIL(Pillow)を使った画像の読み込み

from PIL import Image

# 画像を読み込む
image = Image.open("/kaggle/input/honey-bee-annotated-images/bee_imgs/004_138.png")

# 画像を表示
plt.imshow(image)
plt.axis("off")
plt.show()

PIL(Pillow)は、シンプルに画像を扱うのに便利!

どちらの方法でも、画像をPythonで扱えるようになる!


📌 3. 画像のリサイズ(サイズ変更)

機械学習モデルでは、入力画像のサイズを統一する 必要があります。
例えば、すべての画像を「224×224」ピクセルにリサイズ します。
※(1) OpenCV を使った画像の読み込みの後で実行します。

✅ OpenCVを使ったリサイズ

# 画像を 224x224 にリサイズ
resized_image = cv2.resize(image, (224, 224))

# 画像を表示
plt.imshow(resized_image)
plt.axis("off")
plt.show()

すべての画像を同じサイズに統一!
機械学習モデルに適した入力形式を作る!


📌 4. グレースケール変換(白黒画像に変換)

カラー画像をモノクロ(グレースケール) に変換すると、計算コストが下がり、
手書き数字の認識(MNISTデータセット) などに活用できます。

✅ OpenCVでグレースケール変換

# グレースケール変換
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

# 画像を表示
plt.imshow(gray_image, cmap="gray")
plt.axis("off")
plt.show()

グレースケール画像は、チャンネル数が1つだけになる!(高さ × 幅)
白黒画像の解析に使う!


📌 5. データ拡張(Data Augmentation)

データが少ないと、機械学習モデルの精度が下がることがあります。
そこで、データを人工的に増やす「データ拡張(Augmentation)」 を行います!

✅ 画像の回転・反転・明るさ調整

import albumentations as A
from albumentations.pytorch import ToTensorV2

# 画像の前処理(回転・反転・明るさ変更)
transform = A.Compose([
    A.HorizontalFlip(p=0.5),  # 左右反転
    A.RandomBrightnessContrast(p=0.5),  # 明るさのランダム変更
    A.Rotate(limit=30, p=0.5)  # 最大30度まで回転
])

# 画像を変換
augmented = transform(image=image)["image"]

# 画像を表示
plt.imshow(augmented)
plt.axis("off")
plt.show()

データを増やすことで、モデルの汎化性能を向上!
異なる角度や明るさのデータを作ることで、学習が安定!


📌 6. 画像の数値ベクトル化(配列変換)

機械学習モデルでは、画像を 数値配列(NumPy配列 or Tensor) に変換する必要があります。

✅ OpenCVを使った NumPy 配列変換

import numpy as np

# 画像を NumPy 配列に変換
image_array = np.array(resized_image)

# 配列の形状を確認
print("画像の形状:", image_array.shape)

🔍 出力

画像の形状: (224, 224, 3)  # 高さ×幅×チャンネル(RGB)

NumPy配列に変換することで、機械学習モデルで扱える!
PyTorchやTensorFlowに渡すための準備!


📌 7. PyTorch / TensorFlow で画像をテンソルに変換

ディープラーニングモデルでは、画像データを PyTorchのTensorTensorFlowのTensors に変換します。

✅ PyTorch の Tensor に変換

import torch
from torchvision import transforms

# 画像の変換処理
transform = transforms.Compose([
    transforms.ToTensor()  # Tensorに変換
])

# 画像をTensorに変換
tensor_image = transform(resized_image)

# Tensorの形状を確認
print(tensor_image.shape)  # (3, 224, 224)

(3, 224, 224) の形式に変換し、モデルに入力できるように!
PyTorchのニューラルネットワークに適用可能!


🎯 まとめ

画像データは「高さ × 幅 × 色(RGB)」の数値データ!
OpenCV / PIL を使って画像を読み込み・表示!
リサイズ・グレースケール変換で前処理を行う!
データ拡張(Augmentation)で学習データを増やす!
画像をNumPy配列やTensorに変換し、機械学習モデルに入力可能にする!

Best regards, (^^ゞ