K-Meansクラスタリングによる画像の減色
K-Meansクラスタリングは、与えられたデータを自動的に分類するアルゴリズムであるクラスタリングの一種で、クラスタの平均を用い、与えられたクラスタ数k個に分類する手法です。(Wikipedia >> k平均法)
cv2.kmeans()を用いるとK-Meansクラスタリングが簡単に実装できます。これを画像データに用いてBGRのチャンネルについてクラスタリングし、各クラスタに含まれる画素を、各クラスタの中心値に変換することで減色できます。
OpenCV >> K-Means Clustering in OpenCV 記載のコードをほぼそのまま使用しています。
関連記事
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名'ramen.jpg'で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
ramen.jpg
コード
import numpy as np import cv2 # 画像の読み出し img = cv2.imread('ramen.jpg') # ndarray(y,x,[B,G,R])を変形(y * x,[B,G,R]) Z = img.reshape((-1,3)) # float32に型変換 Z = np.float32(Z) # 計算終了条件の設定。指定された精度(1.0)か指定された回数(10)計算したら終了 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0) # クラスター数 K = 8 # K-Meansクラスタリングの実施 ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS) # 各クラスタの中心色リストcenterをunit8に型変換 center = np.uint8(center) # 中心色リストcenterから分類結果labelの要素を取り出す res = center[label.flatten()] # 元画像の形状に変形 res2 = res.reshape((img.shape)) cv2.imwrite('res2.jpg',res2)
実行結果
8色に減色した画像が保存されます。
以下のサイトを参考にさせていただきました
OpenCV >> K-Means Clustering in OpenCV
OpenCV-Python Tutorials 1 documentation >> OpenCVのK-Meansクラスタリング