Pythonでの画像データの主成分分析を解説していく

スポンサーリンク

PCAについては、すでに以前の記事で取り組んでいます。

今回は、画像データに対する主成分分析について説明します。

PCAは有名な教師なし次元削減手法で、次元の呪いに悩まされるたびに私たちを助けてくれます。

画像データを扱うことは、通常のデータセットとは少し異なります。

一般的なカラー画像は小さな画素(略して「画素」)で構成されており、多くの画素が配列で集まってデジタル画像を形成している。

一般的なデジタル画像は、0から255までの強度を持つ赤青緑の画素配列を積み重ねることで作られます。

#importing the dataset
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
 
digits = load_digits()
data = digits.data
data.shape

グレースケール画像は、色を含まず、グレーの濃淡のみで構成されています。

グレースケール画像の画素強度は、黒(0)から白(255)まで変化し、通常、ブラック&ランプ;ホワイト画像と呼ばれるものになります。

スポンサーリンク

DigitsデータセットにPCAを適用する

Digitsデータセットは、1797枚の8×8画像からなる手書き数字のグレースケール画像データセットです。

#taking a sample image to view
#Remember image is in the form of numpy array.
image_sample = data[0,:].reshape(8,8)
plt.imshow(image_sample)

sklearn.datasetsモジュールからload_digits` クラスをインポートすることにより、素早くdigitsデータをインポートすることができます

数字データの形状は (1797, 64) です。

8×8ピクセルを平坦化し、長さ64のベクトルを画像ごとに作成します。

では、どのようなデータになっているか見てみましょう。

#Import required modules
from sklearn.decomposition import PCA
 
pca = PCA(2) # we need 2 principal components.
converted_data = pca.fit_transform(digits.data)
 
converted_data.shape
plt.style.use('seaborn-whitegrid')
plt.figure(figsize = (10,6))
c_map = plt.cm.get_cmap('jet', 10)
plt.scatter(converted_data[:, 0], converted_data[:, 1], s = 15,
            cmap = c_map , c = digits.target)
plt.colorbar()
plt.xlabel('PC-1') , plt.ylabel('PC-2')
plt.show()

1. 画像の寸法を小さくする

さて、PCAを使用して、散布図を使用してデータセットを視覚化できるように、画像の次元を64から2だけに減らしてみましょう。

sklearnはPCAの非常にシンプルな実装を提供してくれます。

# Importing required libraries
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

データは、(1797, 64)から(1797, 2)に縮小されます。

2. 2. 結果のデータセットを可視化する

主成分分析アルゴリズムを実装するために、sklearn.decomposition が提供する PCA() クラスを使用することにします。

入力引数として、変換後のデータセットに含まれる主成分の数を表す整数を受け取ります。

例えば、PCA(0.90) これは、データの分散の90%を説明する主成分を見つけるアルゴリズムであることを意味します。

結果を可視化してみましょう。

# Loading the image
img = cv2.imread('my_doggo_sample.jpg') #you can use any image you want.
plt.imshow(img)
# Splitting the image in R,G,B arrays.
 
blue,green,red = cv2.split(img)
#it will split the original image into Blue, Green and Red arrays.

画像データ圧縮のための主成分分析

PCAのもう一つのクールなアプリケーションは、画像圧縮です。

pythonでどのようにこれを実現できるかを見てみましょう。

#initialize PCA with first 20 principal components
pca = PCA(20)
 
#Applying to red channel and then applying inverse transform to transformed array.
red_transformed = pca.fit_transform(red)
red_inverted = pca.inverse_transform(red_transformed)
 
#Applying to Green channel and then applying inverse transform to transformed array.
green_transformed = pca.fit_transform(green)
green_inverted = pca.inverse_transform(green_transformed)
 
#Applying to Blue channel and then applying inverse transform to transformed array.
blue_transformed = pca.fit_transform(blue)
blue_inverted = pca.inverse_transform(blue_transformed)

1. 画像の読み込み

今回はOpenCV(Open Source Computer Vision Library)を使用します。

OpenCVは、オープンソースのコンピュータビジョン・機械学習ライブラリです。

img_compressed = (np.dstack((red_inverted, red_inverted, red_inverted))).astype(np.uint8)
#viewing the compressed image
plt.imshow(img_compressed)

2. 画像をR,G,Bの各アレイに分割する

デジタルカラー画像は、R,G,Bの各配列を積み重ねたものであることはご存知のとおりです。

ここでは、画像から各チャンネルを分割し、それぞれから主成分を抽出する必要があります。

RGB Arrays Combined To Make Image
RGB Arrays Combined To Make Digital Image

ここで重要なのは,OpenCVはRed, Blue, Greenではなく,Blue, Green, Redの各チャネルに分割することです.この順番には十分注意してください。

3. 個々のアレイに主成分を適用する

では、各アレイにPCAを適用してみましょう。

Sample Image From Digit Dataset
Sample Image from Digit Dataset

ここでは、最初の20主成分だけを残してPCAを行い、RGBそれぞれのアレイに適用しています。

4. 画像の圧縮

逆変換は、ベース画像の元の寸法を再現するために必要です。

縮小された次元から元の次元を復元する過程で、選択された主成分(今回は20個)のみを残すため、一部の情報が失われる。

Visualizing Digits Data In 2 Dimensions 2
Visualizing Digits Data In 2 Dimensions

関数 dstack を用いて,逆行列を積み重ねます.ここで,配列のデータ型を指定することが重要です.なぜなら,多くの画像は 8 ビットであるからです.また,各ピクセルは 8 ビットバイトで表現されます.

Sample Original Image Output
Sample Original Image Output
Compressed Image With First 20 Principal Components 2
Compressed Image With First 20 Principal Components

上の出力は、20個の主成分を考慮した場合のものです。

主成分の数を増やすと、出力画像はより鮮明になります。

最初の50主成分を使用した場合。

Compressed Image With First 50 Principal Components
Compressed Image With First 50 Principal Components

次に、100個の主成分を使用した場合。

Compressed Image With First 100 Principal Components
Compressed Image With First 100 Principal Components

最初の100個の主成分で、出力はより鮮明になりました。

次に、最初の200個の主成分を用いてPCAを適用してみましょう。

Compressed Image With First 200 Principal Components
Compressed Image With First 200 Principal Components

どうですか?200の主成分で、元の画像と同じようなシャープな画像を作成することができました。

主成分の数は任意です。

最初は小さな値から始めて、希望の出力が得られるまで徐々に増やしていきましょう。

このコードで自由に実験してください。

まとめ

この記事では、次元削減技術としてのPCAの応用を探求し、画像データに適用しました。

また、PCAが画像圧縮にどのように利用されているかも見てきました。

それでは、よい学習を

タイトルとURLをコピーしました