Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

K-means(K平均法)で花の写真を色でクラスタリングする(全画素を特徴量に使う)

K-means(K平均法)で花の写真を色でクラスタリングする では画面全体のBGRの比率を特徴量として用いましたが、全画素のBGR値をそのまま特徴量に用いてクラスタリングをします。

環境
  • windows10 home
  • Anaconda 3/ jupyter notebook 5.6.0
  • Python 3.7.0
  • OpenCV 4.0.0
準備

画像ファイルはフリー写真素材ぱくたそから花の写真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
f:id:T_A_T:20190627003756p:plain
label1
f:id:T_A_T:20190627003803p:plain
label2 f:id:T_A_T:20190627003810p:plain
label3
f:id:T_A_T:20190627003819p:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村