K-means(K平均法)で花の写真を色でクラスタリングする(全画素を特徴量に使う)
K-means(K平均法)で花の写真を色でクラスタリングする では画面全体のBGRの比率を特徴量として用いましたが、全画素のBGR値をそのまま特徴量に用いてクラスタリングをします。
環境
準備
画像ファイルはフリー写真素材ぱくたそから花の写真25枚をダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリに、'flowers2'ディレクトリを作成しそこに保存しました。画像は64px X 64pxに縮小しています。
コード
import os import cv2 import numpy as np dir_path = 'flowers2/' # 画像ファイルのあるフォルダの相対パス files = os.listdir(dir_path) # フォルダ内のファイルのリスト生成 #print(files) # jpgファイルのリスト生成 files_jpg = [s for s in files if '.jpg' in s] list_all = [] for i in files_jpg: # リスト中のファイル数だけ繰り返す img = cv2.imread(dir_path+i) # 画像の読み出し img2 = img.reshape((12288)) # 12288x1に変形 img2_list = img2.tolist() # ndarry→リスト list_all.append(img2_list) # リストをlist_allに追加 # list_allをndarray、float32に変換 list_all_np = np.array(list_all) list_all_f = np.float32(list_all_np) # 計算終了条件の設定。指定された精度(1.0)か指定された回数(10)計算したら終了 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) # クラスター数 K = 4 # K-Meansクラスタリングの実施 ret,label,center=cv2.kmeans(list_all_f,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS) # ラベル別ディレクトリ作成 for i in range(K): new_dir_path =dir_path+str(i) os.mkdir(new_dir_path) # クラスタリング結果に応じたディレクトリに画像ファイルを移動 for file_name,dir_name in zip(files_jpg,label): original_file_name = dir_path+file_name new_file_name = dir_path+str(int(dir_name))+'/'+file_name os.rename(original_file_name,new_file_name)
実行結果
label0
label1
label2
label3