RGB to HSI
R = rgbData[y, x, 0]; G = rgbData[y, x, 1]; B = rgbData[y, x, 2]; r = (double)R / (R + G + B); g = (double)G / (R + G + B); b = (double)B / (R + G + B); value1 = 0.5 * ((r - g) + (r - b)); value2 = Math.Pow((Math.Pow(r - g, 2) + (r - b) * (g - b)), 0.5); radial = Math.Acos(value1 / value2); theta = (int)(radial * 180.0 / Math.PI); if (!double.IsNaN(theta)) h = (b > g) ? (360 - theta) : theta; else h = 0; s = 1 - 3 * CompareRGB.Min(r, g, b); if (double.IsNaN(s)) s = 0; i = (R + G + B) / 3.0;
HSI to RGB
if (H < 120) { fanShaped = FanShapeds.RG扇形; } else if (H >= 120 && H < 240) { H = H - 120; fanShaped = FanShapeds.GB扇形; } else// if (H >= 240 && H < 360) { H = H - 240; fanShaped = FanShapeds.BR扇形; } theta1 = H; theta2 = 60 - H; if (theta2 < 0) theta2 += 360; f = I * (1 - S); j = I * (1 + (S * Math.Cos(theta1) / Math.Cos(theta2))); k = 3 * I - f - j; switch (fanShaped) { case FanShapeds.RG扇形: b = f; r = j; g = k; break; case FanShapeds.GB扇形: r = f; g = j; b = k; break; case FanShapeds.BR扇形: g = f; b = j; r = k; break; default: throw new NotImplementedException(); } r *= 255; g *= 255; b *= 255; if (r > 255) r = 255; else if (r < 0) r = 0; if (g > 255) g = 255; else if (g < 0) g = 0; if (b > 255) b = 255; else if (b < 0) b = 0;
HSI轉回RGB的時候,以下這段程式是重點...
if (r > 255) r = 255; else if (r < 0) r = 0; if (g > 255) g = 255; else if (g < 0) g = 0; if (b > 255) b = 255; else if (b < 0) b = 0;
如果沒有這段,將會出現圖片變暗ok,變亮色彩會跑掉的情況...
感謝趙老師、家在學長以及小金的幫助!
※ 文章中程式碼風格請參考這裡
全站熱搜
留言列表