つまりなにしたの?
ヒストグラム比較も狙ったとおりという感じではなかった。
HSV色空間自体は比較的特徴を表すのに便利そうなのはわかったので、
主成分分析(PCA)にかけて第一主成分で並び替えてみたら、やや改善したように見える。
前回の話
ほぼそっくりの画像もヒストグラムにすると異なるようで離れていたり、
人が見たら全く違うのに人が見たらほぼ同じ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)
やってみた結果