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,變亮色彩會跑掉的情況...

 

感謝趙老師、家在學長以及小金的幫助!

 

※ 文章中程式碼風格請參考這裡

arrow
arrow
    全站熱搜

    小賢 發表在 痞客邦 留言(5) 人氣()