EnsekiTT Blog

EnsekiTTが書くブログです。

更に改善を期待してPCAでも画像の並び替えをやってみた話

つまりなにしたの?

ヒストグラム比較も狙ったとおりという感じではなかった。
HSV色空間自体は比較的特徴を表すのに便利そうなのはわかったので、
主成分分析(PCA)にかけて第一主成分で並び替えてみたら、やや改善したように見える。
f:id:ensekitt:20180818011702j:plain

前回の話

ensekitt.hatenablog.com

ほぼそっくりの画像もヒストグラムにすると異なるようで離れていたり、
人が見たら全く違うのに人が見たらほぼ同じ2枚画像の間に挟まっていたり。
とかはいくつか見られた。

大まかな手順

  • HSV色空間で画像をいっぱい読み込む
  • 画像を縮小する(640x640→64x64)
  • 画像を(1, 64*64*3)のベクトルに変換する
  • 画像を(枚数, 64*64*3)のNumpy Arrayに変換する
  • まとめてPCAにかける
  • 第一主成分(パラメータ)とファイル名をまとめたリストを作成する
  • パラメータでリストをソートする
  • ソート済のリストをもとに新しいフォルダに採番済の名前でコピーする

環境

 % python --version
Python 3.6.4
 % pip freeze
opencv-python==3.4.0.12
matplotlib==2.1.2
numpy==1.14.1
scikit-learn==0.19.1

フォルダ

.
├── img_sort.py
├── images
└── results # 実行するとできる

コード

import os
import shutil
import glob
import cv2
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA

def img2pixarray(filename):
    # HSV色空間で
    img = cv2.imread(filename) 
    img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    # 画像を縮小する(640x640→64x64)
    img = cv2.resize(img, (64,64))
    # 画像を(1, 64*64*3)のベクトルに変換する
    img = np.reshape(img, (1, img.shape[0]*img.shape[1]*img.shape[2]))
    return img

# 画像をいっぱい読み込む
image_path = "images/*.jpg"
path_list = glob.glob(image_path)

pca = PCA(n_components=1)
for index, path in enumerate(path_list):
    img_pix = img2pixarray(path)
    if index is 0:
        pix_list = img_pix
    else:
        pix_list = np.append(pix_list, img_pix, axis=0)
else:
    pcaed = pca.fit_transform(pix_list)


# 第一主成分(パラメータ)とファイル名をまとめたリストを作成する
image_list = []
for index, path in enumerate(path_list):
    image_list.append((pcaed[index, 0], path))

# パラメータでリストをソートする
sorted_list = sorted(image_list, key=lambda tgt: tgt[0], reverse=True) 

# ソート済のリストをもとに新しいフォルダに採番済の名前でコピーする
result_dir = "results"
if not os.path.exists(result_dir):
    os.mkdir(result_dir)
for i, info in enumerate(sorted_list):
    new_path = os.path.join(result_dir, "{0:08d}.jpg".format(i))
    temp_path = info[1]
    shutil.copyfile(temp_path, new_path)

やってみた結果

f:id:ensekitt:20180818011646j:plain

第一主成分のヒストグラムを見てみた

f:id:ensekitt:20180818011731p:plain
ちゃんと正規分布になってた

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。