2016-11-09 7 views
2

色相角度範囲を正しく計算しようとしています。入力デフォルトの色相が120で、しきい値が20であれば、範囲は100 - 140(はい、私は知っています - 複雑な数学)です。赤色の色相角度範囲を計算する

今アプリケーションで、画像をフィルタリングするときに所与の画素は、その範囲に該当する場合、私は確認することができる:ほとんど飽和赤色がある赤色がの範囲で

let inputHue = 120 
let threshold = 20 

let minHue = inputHue - threshold // 100 
let maxHue = inputHue + threshold // 140 

if (pixelHue > minHue && pixelHue < maxHue) { 
    // do something 
} 

今問題ですカラーホイールの0/360にあります。入力色相が10の場合、minHueは現在-10(しきい値は20)であり、maxHue30です。そのためminHueのためにその負の値の条件は失敗します。

let pixelHue = 355 // this falls into a valid red range I want to get 
let minHue = -10 
let maxHue = 30 

if (pixelHue > minHue && pixelHue < maxHue) { 
    // do something 
} 

誰もがカラーホイールのこの問題に取り組むために方法を知っていますか?私は任意の入力色相(赤色だけでなく)で動作する一般的なソリューションを開発しようとしています。

ありがとうございます。

答えて

1

色相はモジュロ360とみなす必要があります。したがって、赤の範囲は0-30と350-360です。

(355>350 AND 355<30) OR (350>30 AND (355>350 OR 355<30))のように355の値が渡されました。

ここで重要ビットは、最初のORの後に開始します。通常の算術演算では、下限と上限をチェックし、両方のテストに合格する必要があります。しかし、モジュラ算術では、下限が上限よりも高い場合、範囲は0にラップされ、2つの両方のテストの一方を渡すだけで済みます。要約に

(hue>min AND hue<max) OR (min>max AND (hue>min OR hue<max))

1

可能なアプローチ:円上の点の両方として色相値を想像し、閾値とこれらの点の間の「短い」の角距離とを比較:

let diff = abs(pixelHue - inputHue) 
if min(diff, 360 - diff) <= threshold { 
    // do something 
}