3

簡単な方法の 1 つは、RGB コンポーネントが等しい場合、それらは灰色を形成すると言うことです。ただし、これがすべてではありません。ほんのわずかな違いでも、グレーに見えるからです。

視聴者が健全な色の視覚を持っていると仮定すると、指定された値がグレーとして認識されるかどうかをどのように判断できますか (おそらく「グレーネス」のしきい値レベルを調整して)。

4

2 に答える 2

4

比較的簡単な方法は、RGB 値をHSV 色空間に変換し、彩度コンポーネントにしきい値を使用することです。たとえば、 「彩度 < 0.05 の場合は「ほぼグレー」、そうでない場合はグレーではありません

彩度、定義上、実際には「グレーネス/カラフルネス」です。

この方法は、R、G、および B チャンネルの違いを使用するよりもはるかに正確です (人間の目は明るい色と暗い色で異なる彩度を知覚するため)。一方、RGB から HSV への変換は計算量が多くなります。正確な答え (グレー/グレー以外) またはパフォーマンスのどちらがより価値があるかを決定するのはあなた次第です。

さらに正確な方法が必要な場合は、L*a*b* 色空間を使用して彩度を計算しsqrt(a*a + b*b)(こちらを参照)、この値にしきい値を適用します。ただし、これはさらに計算集約的になります。

複数の方法を組み合わせることもできます:

  • R、G、B 成分間の単純な差を計算します。色が完全に彩度が低い(例: max(abs(R-G), abs(R-B), abs(G-B)) <= 5) または完全に飽和している(例: )と識別できる場合はmax(abs(R-G), abs(R-B), abs(G-B)) > 100、停止します。

  • それ以外の場合は、L*a*b* に変換し、彩度を次のように計算sqrt(a*a + b*b)し、この値に対してしきい値処理を使用します。

于 2013-04-25T07:54:26.223 に答える
0

r = 160; g = 179; b = 151;

公差 = 20;

if (Math.abs(rg) < 20 && Math.abs(rb) < 20) { #その後グレーとして認識される }

于 2013-04-25T07:53:00.337 に答える