以下の内容はhttps://tat-pytone.hatenablog.com/entry/2019/06/13/210251より取得しました。


K-Meansクラスタリングによる画像の減色

K-Meansクラスタリングは、与えられたデータを自動的に分類するアルゴリズムであるクラスタリングの一種で、クラスタの平均を用い、与えられたクラスタ数k個に分類する手法です。(Wikipedia >> k平均法)
cv2.kmeans()を用いるとK-Meansクラスタリングが簡単に実装できます。これを画像データに用いてBGRのチャンネルについてクラスタリングし、各クラスタに含まれる画素を、各クラスタの中心値に変換することで減色できます。
OpenCV >> K-Means Clustering in OpenCV 記載のコードをほぼそのまま使用しています。

関連記事

ルックアップテーブルによる画像の減色

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

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、ファイル名'ramen.jpg'で、jupyter notebookファイル(***.ipynb)と同じディレクトリに保存しました。
f:id:T_A_T:20190609211927j:plain
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色に減色した画像が保存されます。
f:id:T_A_T:20190613205824j:plain   

以下のサイトを参考にさせていただきました

OpenCV >> K-Means Clustering in OpenCV
OpenCV-Python Tutorials 1 documentation >> OpenCVのK-Meansクラスタリング

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

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




以上の内容はhttps://tat-pytone.hatenablog.com/entry/2019/06/13/210251より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14