画像分析

とても初歩的な画像の分析をやっているのだけど、gcc + libjpeg でいけることはわかったものの、ちょこっと試してみるのにハッシュやソートを組み込むのがアホ臭くなってしまったので、RMagick でお手軽に分析してみることにした。
http://rmagick.rubyforge.org/
MacOSX へのインストールは下記を参考にした。
http://rmagick.rubyforge.org/install-osx.html

少し試してみた結果、ものすごく簡単に画像を取り扱える事がわかった。このようなライブラリを無償で使えるこというのがいかにありがたい事がよくわかる。
たとえば flower.jpg を読み込んで、ピクセル毎の色情報を v = (R,G,B) とし、v を出現頻度の高い順に並べ、特に上位から100までを表示する(要するにヒストグラムをとりたい)、なんていう作業は以下の簡単なコードで実現できてしまう。(使いこなせてない事がばれそうだけど)

#!/usr/bin/env ruby
require 'Rmagick'
include Magick
img = Image.read("flower.jpg").first
hist = img.color_histogram
pixels = hist.keys.sort_by{|pixel| hist[pixel]}.reverse!
100.times { |x|
  pixel = pixels.shift
  print "#{pixel}\t#{hist[pixel]}\n"
}

これはものすごい画期的で、画像のフォーマットの指定もいらないし、ハッシュもソートもとても簡単。RMagick には他にも凝った画像変換ライブラリなどが入っているので、色々遊べそう。いずれはたくさんの画像を扱う事になるので、SQL 遊びに発展しそうで楽しみ。それも Ruby からやるのはとても簡単。

それで肝心の画像解析は、まずは RGB ベースの色空間を使い、頻度の高い色が画像の特徴として使えるかをみてみようと思う。多分論文を探せばこのあたりの知見は色々あるのだろうけど、正解を見つける前に遊んでみるのが目的なので、しばらくは手探りでやってみようと思う。色空間というのはまだ聞きかじった程度の知識しかないのだけど、世の中 RGB だけではない(例えばプリンタは CMYとか)色の表現・定義方法があり、それぞれの空間ごとに表現の幅が広い空間と狭い空間があるそうなので、色を情報を定量的に特徴量として定義する場合、色空間が影響を及ぼす可能性があるかもしれない。このあたりは実は色々と面白い話があることがわかっているのだけど、それは追々。

下記の画像は上が元画像で、下が元画像のうち、上位100の v を表示したもの。例によってベキ的な分布にしたがっているため、表示がつぶれないにそれぞれの色の幅は頻度の対数(log10)としている。明らかに人間的な直感と反するのは、意外に黒っぽい色が多い事。たしかに元画像を見れば陰の部分とか土の部分で暗い部分がが多いのだけど、気持ちとしては、この画像の特徴としては鮮やかな赤とか黄色とか緑が出てきてほしいところ。また、R * G * B は 8bit * 8 bit * 8bit なので特徴量空間としては広すぎると思われる。適度に量子化してやる必要がありそう。しかし単純に等幅で区切ってしまって良いのかはよくわからない。色空間を考慮する必要があるかもしれない。仮にうまく量子化できたとして、適当な教師なし学習をかませれば意味のありそうな情報や自動分類方法が得られるかもしれない。少なくともそういう気になる。・・・とかいう話と似た話は実は既に下記のサイトなどでもやられていたりするのだけど、あくまでお遊びなのでとても気が楽w 
http://www.alipr.com/

あとはてなフォトの色分けも面白いなぁ
http://f.hatena.ne.jp/fotocolor/
flower.jpg
hist.gif