近似色を選ぶ方法に関する実験

 2016/02/27 7M4MON


 とある色と、とある色が似ているか判別する場合、2色の色空間上の距離を計算する必要があります。
 色空間は、「RGB」、「HSB/HSV」、「CIE L*a*b*」の3種類が代表的らしいです。
 そこで、24ビットフルカラーの全色(4096*4096 = 1677216色・ピクセル)の画像を、パレットを固定して減色し、パフォーマンスを比較してみました。
 (画像クリックで原寸となります。firefoxだと画像を開けないときがあるようです。)
 
 元画像

 Full_24bit_RGB_palette.png

 パレットはHTMLで定義されていて、古いブラウザや携帯でもカラーネームを解釈できる(らしい)
 「black, gray, silver, white, maroon, red, purple, fuchsia, green, lime, olive, yellow, navy, blue, teal, aqua」の16色としました。

1.RGB色空間

 赤、青、緑の色成分を3辺とし、その立方体での距離を求めます。
 それぞれの成分は、Color.R、Color.G、Color.B プロパティで参照できます。
 計算する際は、プロパティはBYTE型なので、CInt(Byte)でパースしておきます。
 
 

 149秒
 
 なお、このページによると、RGBに適切な重み付けをすると少しは人間の感覚に近い色差になるようなので試してみました。
 (R:0.299, G:0.587, B:0.114)
 
 Full_24bit_RGB_palette_16_rgb2.png
 
 計算時間に有意な差はありませんでした。

 

2.HSB/HSV色空間

 色相(Hue)、彩度(Saturation・Chroma)、明度(Value・Lightness・Brightness)の三つの成分からなる色空間です。
 color.GetHue()/color.GetSaturation()/color.GetBrightness()メソッドにより簡単に各成分を取得できます。
 最初はこのページの方法でやってみたのですが、うまい具合に行きませんでした。
 
 Full_24bit_RGB_palette_16_hsv_old.png

 175秒

 そこで、参考文献の「Change Detection in Color Images」を参照したところ
 3.3章に「3.3 Euclidean Distance of HSV」とあり、極座標から変換した後に距離を求めるのが正解のようでした。
 よって、hueは hue / 360 として0〜1に変換し、vs * cos(2πh)、 vs * sin(2πh)、 v  の距離を求めました。
 
 Full_24bit_RGB_palette_16_hsv.png

 213秒

 上記の画像は白の領域がほとんど無く、別の画像では近似に違和感がありました。
 そこで、Wikipediaのページを参考にSとBの定義を変えてみました。