目的
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)
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)
img_Lab.shape # -> (32, 32, 3)