13
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【機械学習】scikit learnでの画像減色プログラム

Last updated at Posted at 2016-09-30

こんにちは。
林@アイエンターです。

前回のブログでは、Pandasやデータ可視化用のSeabornを導入し、米国自動車株の解析を行いました。

今回は再びscikit-learnにフォーカスして、機械学習のクラスタリングで用いられる「k平均法(k-means)」で画像の減色処理を行ってみます。
また、今回は画像の扱いには「OpenCV」も使ってみることにします。

k平均法での画像減色

k平均法とはWikiに詳細が記載されておりますが、空間上の点群データをk個のグループに分類するアルゴリズムです。

アルゴリズムから、各点がどこのグループに所属するかと、その各グループの重心の座標が算出できます。

今回は画像データから画素ごとのRGBを取得して、3次元空間の点群として考えます。

例えば画像を8色に減色する場合は、点群を8グループに分類します。
その後に各グループに含まれる点(RGB)の値を、重心の座標(RGB)で
置き換えることで、画像の8色化を実現します。

OpenCVでの画像の読み込み

今回はこの猫の画像を8色に減色してみます。
cat.jpg

まずは、jupyter notebookで解析をしていく際の、基本ライブラリをインポートします。shot1.png

また、今回はOpenCVを用いるのでcv2ライブラリのインポートと、
scikit-learnのclusterライブラリから、k平均法のKMeansを用いることにします。
shot2.png

画像の読み込みは、cv2のimread関数で簡単に読み込みができます。
shot3.png

読み込まれたイメージデータの中身を確認してみます。
shot4.png

arrayになっているようです。shapeでarrayの構造を確認してみます。
shot5.png

縦幅640、横幅480でRGB要素が含まれた配列ということが見て取れます。

ただ、ここで注意が必要なのは、OpenCVで読み込まれたデータは、
色データはBGRの順番で格納されています。

試しにイメージをそのまま表示してみると、こんな見え方をします。
shot6.png

RGBの順番に変更するためには、cv2.cvtColorで変換を行います。
shot7.png

再度、表示してみると正しい色合いで表示されることが確認できるかと思います。
shot8.png

機械学習モデル KMeansでの色変換処理

KMeansのモデルデータを作成して、OpenCVで読み込んだデータを加工していきます。
shot9.png

イメージデータを機械学習のトレーニングデータとして扱うため、RGBデータが並んだフラットな配列に変換します。
shot10.png

トレーニングデータをKMeansモデルに適用します。
shot11.png

これによって、8グループの重心データ配列が取得できます。
モデルデータのcluster_centers_に格納されています。
shot12.png

次にトレーニングデータ自体を用いて、モデルデータで予測処理を行ってみます。
shot21.png

ワーニングが出ていますが以降の処理に影響しないので、そのまま進めていきます。
予測処理を行った結果のYの中身を確認してみます。
shot14-2.png

この配列は、各点群がどこのグループに所属されているかの配列データになっています。

OpenCVで扱うRGBデータは整数値なので、重心データの色配列の要素を整数化します。
shot15.png

変換後のイメージを生成します。
空の配列を用意して、各点について重心のRGBに変換したデータを追加して行きます。
shot16.png

上記で生成された配列は、OpenCVのイメージ配列の次元になっていません。
reshapeして(640×480×3)の配列に変換します。

shot17.png

生成されたイメージを表示してみます。
shot18.png

それっぽく減色されているように見えます。
最後にOpenCVで画像ファイルに出力します。

OpenCVでは色の並びはBGRでしたので、変換したイメージも同じように色の並びを変えてやります。
shot19.png

画像ファイルをcv2.imwriteで出力します。
shot22.png

以下が出力されたファイルになります。
img_cnv.jpg

scikit learnのKMeansモデルとOpenCVライブラリを用いることで
比較的簡単に画像の減色を行うことが出来ます。

今回のお話はここまで!

13
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?