web-dev-qa-db-ja.com

HSV空間の色間の距離を計算する

HSV空間で2色間の距離計量を見つけるつもりです。

各色要素に、色相、彩度、明度の3つの要素があるとします。色相の範囲は0〜360、彩度の範囲は0〜1、値の範囲は0〜255です。

また、色相には円形のプロパティがあります。たとえば、色相の359は、色相の10よりも色相の値が0に近くなります。

ここでHSV空間の2つの色要素間の距離を計算するための優れたメトリックを誰かが提供できますか?

10
user1304846

最初に短い警告:色の距離を計算しても意味がありません(ほとんどの場合)。 ColorimetryCIECAM02 Color Space のようなもの、または距離測度の知覚的線形性に関する50年間の研究結果を考慮しないと、そのような距離測度の結果は直感に反します。距離の測定値に応じて「類似」している色は、視聴者には「非常に異なって」表示され、「距離」が大きい他の色は、視聴者には区別できません。しかしながら...


実際の質問は、主に「色相」の部分を対象としているようです。これは、0〜360の値です。実際、0と360の値は同じで、次の画像に示すように、どちらも「赤」を表します。

Hue

ここで、これらの値の2つの差を計算すると、円周が360の円上の2点の距離が計算されます。値が厳密に[0,360]の範囲にあることは既にご存知でしょう。それを知らなかった場合は、 浮動小数点モジュロ演算 を使用してこれらをこの範囲に入れる必要があります。

次に、これらの色相値間の距離を計算できます。h0およびh1、 なので

hueDistance = min(abs(h1-h0), 360-abs(h1-h0));

これを、両方の点を円に描き、それらが表す小さな「ケーキの一部」、つまり時計回りまたは反時計回りの順序でそれらの間の距離を選択することを想像してみてください。


コメントのために拡張された編集:

  • 「色相」要素は[0,360]の範囲にあります。上記の式を使用して、2つの色相間の距離を計算できます。この距離は[0,180]の範囲です。距離を180.0で割ると、[0,1]の値になります。

  • 「飽和」要素は[0,1]の範囲にあります。 2つの飽和の間の(絶対)差も[0,1]の範囲になります。

  • 「値」要素は[0,255]の範囲にあります。したがって、2つの値の絶対差も[0,255]の範囲になります。この差を255.0で割ると、[0,1]の値になります。

したがって、HSVタプルが2つあると想像してください。彼らへ電話します (h0,s0,v0)および(h1,s1,v1)。次に、次のように距離を計算できます。

dh = min(abs(h1-h0), 360-abs(h1-h0)) / 180.0
ds = abs(s1-s0)
dv = abs(v1-v0) / 255.0

これらの各値は[0,1]の範囲になります。このタプルの長さを計算できます。

distance = sqrt(dh*dh+ds*ds+dv*dv)

この距離は、HSV空間の場合は メートル法 になります。

14
Marco13

[0、2pi)、[0、1]、[0、1]の範囲に正規化されたhsv値が与えられると、この式は色をHSVコーンに投影し、そのコーンの2乗(カルテシアン)距離を示します。 :

   ( sin(h1)*s1*v1 - sin(h2)*s2*v2 )^2
 + ( cos(h1)*s1*v1 - cos(h2)*s2*v2 )^2
 + ( v1 - v2 )^2
5
Sean Gerrish