计算红色的色调角度范围

时间:2016-11-09 11:26:36

标签: swift

我正在尝试正确计算色调角度范围。如果输入默认色调为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
}

有谁知道如何解决色轮问题?我正在尝试开发一种适用于任何给定输入色调的通用解决方案(不仅仅是红色)。

提前致谢。

2 个答案:

答案 0 :(得分:1)

色调应该被视为模360.因此红色的范围是0-30和350-360。

现在355的值已经过了(355>350 AND 355<30) OR (350>30 AND (355>350 OR 355<30))

此处的关键位在第一个OR之后开始。在常规算术中,您可以检查下限和上限,并且必须通过两个测试。但在模运算中,如果下限高于上限,则范围约为0,您只需要传递两个测试中的一个。

回顾一下:(hue>min AND hue<max) OR (min>max AND (hue>min OR hue<max))

答案 1 :(得分:1)

一种可能的方法:将两个色调值设想为圆上的点,并将这些点之间的“较短”角距与阈值进行比较:

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