【问题标题】:HSV / RGB color space conversionHSV/RGB色彩空间转换
【发布时间】:2012-01-13 17:11:56
【问题描述】:

我在这个论坛上找到了这个代码,但我对代码有疑问。

  1. 在此代码中 sn-p "int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;"为什么完整的答案是模数为 6? (%6)

  2. 为什么“value = value * 255”的值乘以255?

    我参考了这篇研究论文(p-15,p-16)并讨论了相同的算法,但我发现了这些差异。

    http://www.poynton.com/PDFs/coloureq.pdf

    public static Color ColorFromHSV(double hue, double saturation, double value)
    {
        int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
        double f = hue / 60 - Math.Floor(hue / 60);
    
        value = value * 255;
        int v = Convert.ToInt32(value);
        int p = Convert.ToInt32(value * (1 - saturation));
        int q = Convert.ToInt32(value * (1 - f * saturation));
        int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));
    
        if (hi == 0)
        return Color.FromArgb(255, v, t, p);
        else if (hi == 1)
        return Color.FromArgb(255, q, v, p);
        else if (hi == 2)
        return Color.FromArgb(255, p, v, t);
        else if (hi == 3)
        return Color.FromArgb(255, p, q, v);
        else if (hi == 4)
        return Color.FromArgb(255, t, p, v);
        else
        return Color.FromArgb(255, v, p, q);
     }
    
    public void convertToHSV(Color color, out double hue, out double saturation, out double value)
    {
        int max = Math.Max(color.R, Math.Max(color.G, color.B));
        int min = Math.Min(color.R, Math.Min(color.G, color.B));
    
        hue = color.GetHue();
        saturation = (max == 0) ? 0 : 1d - (1d * min / max);
        value = max / 255d;
    
    }
    

【问题讨论】:

  • 是因为色调在柱坐标中改变了它的颜色吗?伙计们帮帮我

标签: image-processing colors rgb hsv hue


【解决方案1】:
  1. 关于

    int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;

如果其他代码段中涉及颜色转换,不能确保除以 mod 360,则色调可能表示为大于 360 或小于 0。 如果您 100% 确定所有其他函数将在 [0,360] 范围内返回色调,则不需要模 6。

  1. 在 HSV 中,Value 通常被归一化为 [0,1] 连续区间,而在 RGB 中则为离散 [0,255] 区间。因此两者都是:

      value = value * 255;
    

      value = max / 255d;

【讨论】: