【问题标题】:Calculate hue angle range for red colours计算红色的色调角度范围
【发布时间】:2016-11-09 11:26:36
【问题描述】:

我正在尝试正确计算色调角度范围。给定输入默认色调12020 的阈值范围在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。给定输入色调10minHue 现在是-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
}

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

提前致谢。

【问题讨论】:

    标签: swift


    【解决方案1】:

    色调应以 360 为模。因此红色的范围是 0-30 和 350-360。

    现在355 的值通过了,因为(355&gt;350 AND 355&lt;30) OR (350&gt;30 AND (355&gt;350 OR 355&lt;30))

    这里的关键位在第一个 OR 之后开始。在普通算术中,您检查下限和上限,并且您必须通过这两个测试。但在模算术中,如果下限高于上限,则范围围绕 0,您只需通过两个测试之一。

    回顾一下:(hue&gt;min AND hue&lt;max) OR (min&gt;max AND (hue&gt;min OR hue&lt;max))

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-30
        • 2015-06-15
        • 1970-01-01
        • 2015-08-02
        • 2011-10-28
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多