計算結果についての考察

Share

ここでは、作成したプラグインの計算結果を確認するために、別の方法(OpenCV)を用いて色変換を実行し、両者を比較してみました。

 

OpenCVによる色変換プログラム

作成したのは、以下のようなものです。

  • OS:Ubuntu 9.04 Desktop 日本語 Remix版
  • OpenCV 2.0.0

ソースコードは次のものです。

色空間変換(OpenCV版)

これを

g++ -Wall `pkg-config opencv --cflags --libs` color_distance.cpp 

としてコンパイルしました。実行時に、ファイル名と変換を行いたい、座標値をx,yの順番で入力して起動すると、CIEL*a*b*に変換した結果を出力するだけのシンプルなプログラムです。

 

比較結果

下記のサンプル画像に対し、各色でのCIEL*a*b*の計算結果を比較してみました。

サンプル画像

代表として、左側の灰色(白の下側)と、シアンの結果を載せておきます。

本プラグインの結果

OpenCVのサンプルプログラムの結果(左側の灰色の点)

OpenCVによる色変換(灰色)

OpenCVのサンプルプログラムの結果(シアンの点)

OpenCVによる色変換(シアン)

 

両者の結果は、若干異なりますが一致していると考えて問題ないかと思います。この若干の違いが生じる真の理由は不明なのですが、

  • CMMでは色の変換にLUT(Look up table)が用いられている。この際の計算誤差のため若干値が異なっている。
  • sRGBはホワイトポイントとしてD65を用い、ICCプロファイルのプロファイル接続空間(PCS)はホワイトポイントとしてD50を用いている(出力先のCIE L*a*b*のホワイトポイントはD65)。ホワイトポイントが異なる場合に、Bradford変換により対応が計算されるが、これが近似計算である(Bradford変換時のずれに関してはBruceLindbloomのサイトを参照)。一方、OpenCVの計算ではD50の色空間を経由せずに計算を行っているために差分が生じている。

といった可能性が考えられます。

このような結果から、おおよそのL*a*b*空間での距離を求めるのに、本プラグインが使えるのではないかと思います。

 

補足:OpenCVでの色変換について

OpenCVの色空間の変換式(OpenCVの色変換関数の説明にあるもの)の説明から分かるように、RGBは原刺激Rec709を想定し、ホワイトポイントはD65を想定しています。一方、sRGBも原刺激とホワイトポイントはこれと同じなのですが、CRTによる表示を考慮しガンマ値(約2.2)による非線形変換を含めています。

このため、OpenCVのプログラムで入力画像をsRGBとみなしてCIEL*a*b*に変換を行うためには、cvCvtColorによるRGB→XYZの変換の前に、sRGBの非線形変換を取り除く必要があります。ICCのサイトから取得できるsRGBの解説には、この変換式が(直接的に)載っていなかったので、英語版のWikipediaに掲載されていた変換式を用いました。

 

なお、OpenCVによる色変換は、同じ変換式をExcelに記述して上記の画像の各色で両者の結果がほぼ一致することにより確認しています。

 

追記

2010年2月24日

  • OpenCV版のコードでR,G,B値を表示する箇所が間違っていました(画面への出力だけで、計算結果に影響はありません)。ソースコードと画像を正しいものに入れ替えました。
  • 計算結果の差異についての考察に、Bradford変換の可能性を追加しました。