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,變亮色彩會跑掉的情況...
感謝趙老師、家在學長以及小金的幫助!
※ 文章中程式碼風格請參考這裡
文章標籤
全站熱搜

你好 你最上面有一段 r = (double)R / (R + G + B); g = (double)G / (R + G + B); b = (double)B / (R + G + B); 應該是想把RGB從0~255 轉換成 0~1 但分母這樣寫應該不是正確的 若改成 r = (double)R / (255); g = (double)G / (255); b = (double)B / (255); 這樣如何呢?
你好,這兩種寫法都可以,不會影響到結果
你好 我個人的實際測試結果是 用一樓說的才正確 而使用R+G+B無法正確由HSI轉回RGB
請問FanShapeds.RG扇形是?
太久沒碰這塊了@@ 可以把他看成是一個群組,有些算出來會是在同一個空間,可以共用相同的程式
你好 請問RGB 轉到 HSI 在轉回RGB後 每一點的RGB值都會跟原圖一模一樣嗎? 還是會跑掉一點點??
不會跟原圖一模一樣