2つのRGB色を比較し、それらの類似度の値を生成するアルゴリズムを探しています(類似度とは、「人間の平均的な知覚に関して類似」を意味します)。
何か案は?
[〜#〜] edit [〜#〜]:
もう答えられないので、質問に対する編集として「解決策」を入れることにしました。
私は自分のアプリで色の比較を処理できるように、アプリでトゥルーカラーの(非常に)小さなサブセットを使用することにしました。私は約30色で作業し、それらの間のハードコードされた距離を使用します。
これはiPhoneアプリであったため、objective-Cで作業しましたが、実装は多かれ少なかれ、色間の距離を示す下の表を表すマトリックスです。
ユークリッド空間でのRGB距離は、「平均的な人間の知覚にあまり似ていません」
[〜#〜] yuv [〜#〜] 色空間を使用できます。この要素を考慮します:
この目的で [〜#〜] cie [〜#〜] 色空間を使用することもできます。
編集:
YUV色空間は、簡単な式で計算できる安価な近似であることに言及します。しかし、それは知覚的に均一ではありません。知覚的に均一とは、色値の同じ量の変化が視覚的にほぼ同じ重要性の変化をもたらすことを意味します。より正確で厳密なメトリックが必要な場合は、CIELAB色空間または他の知覚的に均一な空間を必ず考慮する必要があります(変換用の単純な公式がなくても)。
CIE94 (DeltaE-1994)を使用することをお勧めします。これは、人間の色知覚の適切な表現であると言われています。私はコンピュータービジョン関連のアプリケーションでかなり使いましたが、結果にはかなり満足しています。
ただし、そのような比較を実行するのはかなり計算コストがかかります。
RGB to XYZ
_両方の色XYZ to LAB
_両方の色Diff = DeltaE94(LABColor1,LABColor2)
式(擬似コード):
人間の知覚は、輝度よりも彩度が弱いです。
たとえば、コマーシャルビデオでは、YCbCr/YPbPr色空間(Y'UVとも呼ばれます)は、クロマ情報の解像度を下げますが、輝度(Y)は保持します。 4:2:0や4:2:2などのデジタルビデオ圧縮では、知覚が比較的弱いため、クロマビットレートが低下します。
輝度関数(Y)よりも優先度が高く、クロマよりも優先度が低い距離関数を計算できると思います。
また、低強度下では、人間の視覚は実質的に白黒です。したがって、優先度関数は非線形であり、低輝度(Y)の場合、彩度への重みはますます少なくなります。
色距離の問題については、次の優れた記事を参照してください。 http://www.compuphase.com/cmetric.htm
リソースが消失した場合、著者の結論は、2つのRGBカラー間の距離に対する最適な低コストの近似は、この式(コード内)を使用して達成できるということです。
typedef struct {
unsigned char r, g, b;
} RGB;
double ColourDistance(RGB e1, RGB e2)
{
long rmean = ( (long)e1.r + (long)e2.r ) / 2;
long r = (long)e1.r - (long)e2.r;
long g = (long)e1.g - (long)e2.g;
long b = (long)e1.b - (long)e2.b;
return sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}
色知覚はユークリッドではありません。距離の式は、十分に優れていると同時に恐ろしいものです。ユークリッド距離(RGB、HSV、Luv、Labなど)に基づく測定値は、類似した色に対して十分であり、水色が青緑に近いことを示します。しかし、閉じていない値の場合、任意になります。たとえば、赤は緑に近いですか、それとも青に近いですか?
Charles Poynton's Color FAQ から:
XYZおよびRGBシステムは、知覚的な均一性を示すにはほど遠いです。 XYZの合理的に知覚的に均一な空間への変換を見つけることは、CIEで10年以上を費やし、最終的には単一のシステムは合意できませんでした。