Android で簡単に色差を求めたいけど、単純に RGB 色空間上でのユークリッド距離だと人間の感覚と合わないからなあ、、と思って調べると、 ColorUtils というクラスで簡単に Lab 色空間上の距離を求めることができました。
Lab 色空間は人間の視覚特性に合うように考えられた色空間で、その距離を取ることで人間の感覚に近い色の距離を求めることができます。
もう少し具体的な話はブログに投稿しましたので、よろしければご覧ください。
ColorUtils
ColorUtils クラスは support-v4 ライブラリに含まれている色に関する便利な機能を提供するクラスで、 色差を求めるための distanceEuclidean()
というメソッドがあります。
このメソッドは2つの Lab 色空間で表された色を引数に受け取り、それらのユークリッド距離を求めて返します。
ColorUtils には色空間を変換するメソッドも多数用意されており、 ColorUtils.RGBtoLAB()
や ColorUtils.colorToLAB()
メソッドを使用することで RGB 色空間を Lab 色空間に変換することができます。
これらを組み合わせることで、簡単に色差を求める事ができました。
色差を求める
2つの色から色差 (Lab 色空間上でのユークリッド距離) を求めるには次のようにします:
val labArray1 = DoubleArray(3).also {
ColorUtils.RGBtoLAB(r1, g1, b1, it)
}
val labArray2 = DoubleArray(3).also {
ColorUtils.RGBtoLAB(r2, g2, b2, it)
}
val distance = ColorUtils.distanceEuclidean(la1, labArray2)
または、 0xFF0088FF
などの @ColorInt Int
を用いて
val labArray1 = DoubleArray(3).also {
ColorUtils.colorToLAB(colorInt1, it)
}
val labArray2 = DoubleArray(3).also {
ColorUtils.colorToLAB(colorInt2, it)
}
val distance = ColorUtils.distanceEuclidean(la1, labArray2)