LoginSignup
0
0

More than 1 year has passed since last update.

【Lab色空間】cifar-10画像データを読み込みRGB画像をLab画像に変換する方法(Python)

Posted at

目的

cifar-10の画像データを読み込みRGBをLabに変換する

事前準備

インポート

import pickle
import numpy as np
import matplotlib.pyplot as plt
import cv2

画像の読み込み

cifar-10データセットから画像データセットをダウンロード

画像の中身cifar-10データセットより引用)

  • 10クラスの60000の32x32カラー画像
  • RGBフルカラー画像: RGB(赤色/緑色/青色)3色の組み合わせで、それぞれ「0」~「255」の256段階
  • 1つ分のデータが基本的に(3, 32, 32)もしくは(32, 32, 3)(=計3072要素)という多次元配列の形状

「pickled」オブジェクトのため、ファイルを開いて辞書を返す

def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

(unpickle関数はcifar-10データセットより引用)

辞書の中身cifar-10データセットより引用)

  • データ- 10000x3072 numpyののの配列のuint8。配列の各行には、32x32のカラー画像が格納されます。最初の1024エントリには赤のチャネル値が含まれ、次の1024エントリには緑、最後の1024エントリには青が含まれます。画像は行優先順に格納されるため、配列の最初の32エントリは、画像の最初の行の赤チャネル値になります。
  • ラベル-0〜9の範囲の10000個の数値のリスト。インデックスiの番号は、配列データのi番目の画像のラベルを示します。

data_batch_1の読み込み

# バッチ1を読み込み
data_batch_1 = unpickle('cifar-10-batches-py/data_batch_1')
data_batch_1_data.shape # -> (10000, 3072)

カラー画像のNumpy配列に変換

辞書では1列のNumpy配列になっているため、カラー画像のNumpy配列に変換する。

# 1 列の Numpy 配列を 32 x 32 のカラー画像の Numpy 配列に変換
def data_to_array(data):
    ar1 = np.empty((32, 32, 3), dtype='uint8')
    data1 = data.reshape(3, 32, 32)
    for i in range(3):
        ar1[:, :, i] = data1[i, :, :]
    return ar1
# バッチ1データ(10000件)を 32 x 32 のカラー画像の Numpy 配列に変換しリストに格納
data_batch_1_img_list = list()

for data in data_batch_1_data:
    img = data_to_array(data)
    #print(img.shape)
    data_batch_1_img_list.append(img)
len(data_batch_1_img_list) # -> 10000
type(data_batch_1_img_list[0]) # -> numpy.ndarray

表示

カラー画像のNumpy配列に変換したリストを表示。

# カラー画像を表示
def check_image(n):
    plt.imshow(data_batch_1_img_list[n])
chek_image(0)

cifar-10.png

Lab画像に変換

Lab画像とは?

"Lab色空間は補色空間の一種で、明度を意味する次元 L と補色次元の a および b を持ち、CIE XYZ 色空間の座標を非線形に圧縮したものに基づいている。RGBやCMYKとは異なり、Lab色空間は人間の視覚を近似するよう設計されている。"
(出典:https://ja.wikipedia.org/wiki/Lab%E8%89%B2%E7%A9%BA%E9%96%93)

Lab画像に変換し表示する。

# rgb を Lab に変換
img_Lab = cv2.cvtColor(data_batch_1_img_list[0], cv2.COLOR_RGB2Lab)
img_L, img_a, img_b = cv2.split(img_Lab)
plt.imshow(img_Lab)

cifar_10_Lab.png

img_Lab.shape # -> (32, 32, 3)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0