本系列第三篇,實作三種經典彩色轉灰度演算法:最大值法、平均值法、加權平均值法 (ITU-R BT.601),比較視覺效果差異。
| 演算法 | 公式 | 特點 |
|---|---|---|
| 最大值法 | Gray = max(R, G, B) | 亮度最高,細節較少,對比強 |
| 平均值法 | Gray = (R + G + B) / 3 | 簡單均衡,但忽略人眼敏感度差異 |
| 加權平均值法 | Gray = 0.299R + 0.587G + 0.114B (或 0.7/0.2/0.1) | 符合人眼亮度感知,**視覺最自然** |
private void btnGrayscale_Click(object sender, EventArgs e)
{
try
{
int w = pictureBox1.Image.Width, h = pictureBox1.Image.Height;
using (var newBmp = new Bitmap(w, h))
using (var oldBmp = (Bitmap)pictureBox1.Image)
{
for (int x = 0; x < w; x++)
for (int y = 0; y < h; y++)
{
Color p = oldBmp.GetPixel(x, y);
int r = p.R, g = p.G, b = p.B;
int gray;
// 切換演算法:0=平均, 1=最大值, 2=加權 (預設)
int mode = 2;
switch (mode)
{
case 0: gray = (r + g + b) / 3; break;
case 1: gray = Math.Max(r, Math.Max(g, b)); break;
case 2: gray = (int)(0.7 * r + 0.2 * g + 0.1 * b); break;
default: gray = (r + g + b) / 3; break;
}
newBmp.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
}
pictureBox1.Image = newBmp;
}
}
catch (Exception ex) { MessageBox.Show(ex.Message, "提示"); }
}

0.299R + 0.587G + 0.114B:ITU-R BT.601 (SDTV) 標準亮度。0.2126R + 0.7152G + 0.0722B:ITU-R BT.709 (HDTV) / sRGB 標準亮度。0.7/0.2/0.1 為簡化近似,實務建議採用標準係數。加權平均值法最符合人眼視覺,是灰度轉換首選。理解亮度感知模型,有助於選擇適合專案需求的演算法。