画像を特徴色を調べる

ちょっと画像の類似度を使って分類実験したいと思います。

それでどうやって画像の類似度を測ろうかなぁと悩んだのですが、その画像を代表する幾つかの色でパレットを作って、その距離でもって類似度にするのが簡単そうなのでやってみることにしました。

なお画像の特徴色は正式な言葉ではありません。英語だとDominant Colorという単語はあるようですが、対応する日本語はわかりませんでした。この記事ではDominant Colorの意味で特徴色と書きたいと思います。

Median Cut

じゃあどうやって特徴色を抜き出そうかなと色々調べていると、よくよく考えてみると当たり前なんですが、画像の減色処理で同じような事が行われているというのが分かりました。そして減色処理で使われてるらしいアルゴリズムにMedian Cutというのがあります。

Wikipediaに説明が無いので、ざっと書くと以下のようなアルゴリズムです。youtubeにこのアルゴリズムが良く解る動画があるので合わせて参照ください。

  1. 画像の各ピクセルをRGB空間に写像する
  2. ピクセルの分布範囲が最も広いRGBのいずれかの軸を対象に、ピクセル数が等分になるように空間を2分割する
  3. 分割された空間のうち、最もピクセルの分布範囲が大きい軸を持つ空間を次の分割対象とする
  4. 2〜3を繰り返して、必要な個数までRGB空間を分割する
  5. 分割された部分空間毎に、その部分空間に含まれるピクセルの平均色を出す

このアルゴリズムを実装してみた、スクリーンショットが以下になります。表示している画像の下に出てる四角のパレットみたいなのが、抽出された特徴色です。前回のPySideはこれの為だったわけですね。

mediancut1

最初は良い感じやん!と思いましたが、色々試しているとダメなケースがチラホラ出てきます。例えば以下のような場合。

変な色が入ってくる。あと白が2つある。
median cut2

赤が出てほしいけど出てない。
mediancut3

イラスト調の画像だと上手く使われている色が出ていないし、写真でも明らかに画像の特徴を示すワンポイントカラーが出ない傾向があります。何でこんな事になるかというと、ピクセル数を等分するように空間を分割している為に、

  • 同じ色が複数の空間にまたがって分割される
  • 分割時に面積が重視されているので、面積が小さいワンポイントカラー部分がもれる

と言った事が発生しています。

Modified Median Cut

これだとちょっとなぁと思って調べていると、このページが見つかりました。leptonicaという画像処理ライブラリの解説ページで、Median Cutがイケテないから修正版としてModified Median Cutを実装しているよと書かれています。

両者の違いは色々あるのですが、一番の違いは空間分割時にヒストグラムを用いて、ピクセル数をピッタリ等分ではなく大体等分に制約を緩めて、同じ色が複数の空間にまたがらないようになっている事です。また謎のヒューリスティックですが、ピクセル数を元に空間を分割するのは全体の85%までで、残りの15%はピクセル数 x 空間の体積を元に分割するようにされています。

このModified Median Cutはどうも厳密なアルゴリズムの定義は無くて、パラメータを色々弄って一番良さそうなところで落ち着けたという雰囲気です。良く解らないコードを書くのはあれなので、ヒストグラムを用いる部分を僕も使わせてもらいました。それで実装した結果が以下。

modified median cut 1

modified median cut2

まぁまぁマトモな結果が出ているような気がしますので、これからこれを使って画像分類の実験をしてみようと思います。一応今回書いたコードはgithubに上げているので、何か変な事してたら教えてください。

あとさっきのleptonicaのページによると、減色処理だと今はoctreeっていうアルゴリズムが一番イケテルらしいですが、疲れたので調べていません。

1 thought on “画像を特徴色を調べる”

Leave a Reply

Your email address will not be published. Required fields are marked *