2011-11-22 295 views
0

即时将RGB彩色图像转换为HSV颜色空间,并使用轨迹栏更改色相并将其转换回RGB值。这种方法工作正常,并改变颜色,除了白色和黑色像素。这是为什么?使用HSV颜色空间更改白色和黑色颜色

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; 

     } 

回答

3

这是因为白色,灰色和黑色都没有色调,所以如果他们的色调被改变,它们不会改变。

+0

确实:只有黑色,白色和灰色变化的亮度。饱和度(可以被认为是颜色强度)是0,因此色调(颜色)没有效果。 –

+0

saturation =(max == 0)? 0:1d - (1d * min/max)在这段代码中发生了什么? –