首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

GDI+ 進階議題:ColorMatrix 色彩矩陣仿射變換完全指南

     編輯:關於.NET

9. Color Matrix 色彩矩陣

影像本質是二維像素陣列,每像素為 (R,G,B,A) 四維向量。在 RGBA 色彩空間,5×5 矩陣乘以該向量即可實現色彩仿射變換(縮放、旋轉、平移),概念源自三維空間仿射變換。5x5 ColorMatrix 結構

網路上常見「顏色旋轉 60 度」等說法實則誤導,色彩空間無幾何旋轉意義。下面給出實用矩陣範例。

a. 灰度化

移除彩色資訊,常用 NTSC 加權演算法:
R' = G' = B' = 0.299R + 0.587G + 0.114B

對應矩陣:

float[][] ptsArray = {
    new float[] {0.299f, 0.299f, 0.299f, 0, 0},
    new float[] {0.587f, 0.587f, 0.587f, 0, 0},
    new float[] {0.114f, 0.114f, 0.114f, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {0, 0, 0, 0, 1}
};

灰度化效果

b. 調整色彩(增加紅色分量)

使用第 5 行第 1 欄 (m51) 加入位移量:

float[][] ptsArray = {
    new float[] {1, 0, 0, 0, 0},
    new float[] {0, 1, 0, 0, 0},
    new float[] {0, 0, 1, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {0.1f, 0, 0, 0, 1}  // 紅色 +0.1 (約 25.5 階)
};

增加紅色效果

c. 調整亮度

第 5 行前三欄同加位移:

new float[] {0.1f, 0.1f, 0.1f, 0, 1}  // 各通道 +0.1

亮度調整效果

d. 調整對比度

對角線乘以係數 >1 提高對比,但直接這樣會導致溢位(像素值超過 255),畫面慘不忍睹。駭客技巧:在第 5 行加入極小位移 (0.001) 抑制溢位:

float[][] ptsArray = {
    new float[] {1.5f, 0, 0, 0, 0},
    new float[] {0, 1.5f, 0, 0, 0},
    new float[] {0, 0, 1.5f, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {0.001f, 0.001f, 0.001f, 0, 1}  // 微調防溢位
};

對比度調整效果

e. 調整飽和度

需依色彩權重計算,參考 Grafica Obscura。可用矩陣(s=1.2 為提高 20% 飽和度):

float rwgt = 0.3086f, gwgt = 0.6094f, bwgt = 0.0820f;
float s = 1.2f;
float[][] ptsArray = {
    new float[] {(1-s)*rwgt+s, (1-s)*rwgt, (1-s)*rwgt, 0, 0},
    new float[] {(1-s)*gwgt, (1-s)*gwgt+s, (1-s)*gwgt, 0, 0},
    new float[] {(1-s)*bwgt, (1-s)*bwgt, (1-s)*bwgt+s, 0, 0},
    new float[] {0, 0, 0, 1, 0},
    new float[] {0, 0, 0, 0, 1}
};

飽和度調整效果

GDI+ 中實際套用 ColorMatrix

FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs, false, false);
Bitmap bmp = new Bitmap(img);
img.Dispose(); fs.Close();

Graphics g = this.CreateGraphics();
// ... 設定 ptsArray 同前 ...
ColorMatrix matrix = new ColorMatrix(ptsArray);
ImageAttributes attr = new ImageAttributes();
attr.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Default);

// 原圖
g.DrawImage(bmp, 0, 0, 200, 150);
// 套用矩陣後
g.DrawImage(bmp, new Rectangle(205, 0, 200, 150), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attr);

bmp.Dispose(); g.Dispose();

色彩矩陣研究空間廣大,許多專利圍繞此領域,亦是學術論文熱門題目。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved