單元 11 · 白平衡與色彩(AWB / CCM)

gains、灰卡校正、CCM 實作

11.1 AWB 原理:把白校正回白

場景色溫(如 3000K 黃光)R/G/B gains白回白

人眼會適應色溫,感測器不會。AWB 演算法算出一組 gains,讓中性色(灰/白)在中性。

11.2 色溫與人眼的關係

光源色溫(K)視覺AWB 傾向
燭光~1900很黃提升 R gain
白熾燈~2700–3200提升 R gain
日光燈~4000–5000中性偏冷微調
日光~5500–6500中性gains ≈ 1
陰影/陰天~7000+提升 B gain
工程直覺:低色溫補 R、高色溫補 B——這是 AWB gains 的方向。超過感測器/鏡頭的 AWB 範圍會「色偏無解」,需外加濾鏡或光源校正。

11.3 灰卡校正標準程序(實作)

  1. 放灰卡(18% 灰卡或積分球),固定光源與曝光。
  2. 關 AWB,手動調 RedGain/BlueGain。
  3. 拍到灰卡 R=G=B(直方圖中心接近)為止。
  4. 記錄該光源的色溫 → gains 對。
picamera2 手動白平衡
picam2.set_controls({
    "AwbEnable": False,
    "ColourTemperature": 4500,
    "RedGain": 1.6,     # 先設中性 1.0 再逐步調整
    "BlueGain": 1.2,
})
調適陷阱:固定色溫時,若 gains 與色溫不匹配,白會偏黃/偏藍——用灰卡校正最準,不要靠「看起來」。

11.4 CCM:色彩校正矩陣

感測器的色彩響應不完美(濾鏡串擾、響應曲線偏移),用 3×3 矩陣校正到標準色彩空間(sRGB/Rec.709)。分色溫兩套(低色溫/高色溫)因為感測器響應隨光譜不同。

CCM 示意(對角>1,副對角負)
{ {1.6, -0.3, -0.3},
  {-0.2,  1.4, -0.2},
  {-0.1, -0.3,  1.4} }
陷阱:CCM 過頭 → 過飽和、色階斷裂(banding);gains 與 CCM 互相影響,要一起看。先 AWB 中性,再 CCM 定色。

11.5 用色卡量化算 CCM(實作)

  1. X-Rite 24 色卡(固定光源/曝光)。
  2. 讀每色塊 RGB(RAW 經中性 AWB)。
  3. 對色卡目標值(已知 sRGB 值)算最小化 ΔE 的 3×3。
  4. 寫入 tuning 檔 ColourMatrix 區塊(單元 14)。
  5. 不同色溫重複 → 建立分段 CCM。
量化驗證:ΔE
# 用 deltaE2000 比較校正前後與目標色卡的色差
python3 - <<'EOF'
# 以 colour-science 或自寫 deltaE2000
# 目標:平均 ΔE < 3(工業常用門檻)
# 各色塊最大 ΔE < 6
EOF

11.6 色彩調校紀律

11.7 深入:AWB gains 與色溫的對應

典型 gains(示意,依感測器)
3000K:  RedGain=1.7  BlueGain=1.2
4500K:  RedGain=1.4  BlueGain=1.3
6500K:  RedGain=1.1  BlueGain=1.6
7500K:  RedGain=1.0  BlueGain=2.0

趨勢固定:低色溫補 R、高色溫補 B。實際值隨感測器/鏡頭而異,用灰卡實測。

11.8 深入:CCM 為什麼要分色溫

感測器對不同光譜(低/高色溫)的響應曲線不同 → 單一 CCM 無法同時校正兩種光源 → 分兩套(低溫/高溫)並依 AWB 色溫插值。

陷阱:若只做一套 CCM,在另一色溫下色彩會明顯偏移。驗收時要在「至少兩個色溫」下量 ΔE。

11.9 練習:完整灰卡+色卡校正

  1. 灰卡校正 AWB gains(記錄色溫→gains 表)。
  2. 色卡算 CCM(至少兩色溫)。
  3. 量測校正前後 ΔE,確認達標。
看完這單元你應該能說出:
  • AWB 原理與 gains 角色。
  • 灰卡校正標準程序。
  • CCM 與分色溫。
  • 色卡量化算 CCM(ΔE)。
  • 色彩調校紀律。

進階真實情境 Worked Example:在混合光源下校正 AWB 與 CCM

場景:你的場景同時有窗外日光(6500K)和室內白熾燈(2700K),AWB 演算法在兩者之間來回跳動。需要找到一個穩定的 gains 組合。

混合光源 AWB 穩定化
# 1. 分別量測兩個區域的色溫
# 窗邊區域(日光):
rpicam-still --raw --shutter 10000 --gain 1 -o mix_window.dng
# 室內區域(白熾):
rpicam-still --raw --shutter 30000 --gain 1 -o mix_indoor.dng

# 2. 用灰卡量測各光源的 gains
# 日光區(色溫約 6500K):
#   RedGain=1.1  BlueGain=1.6
# 白熾區(色溫約 2700K):
#   RedGain=1.8  BlueGain=1.0

# 3. 用 picamera2 設定中間值
python3 - <<'EOF'
from picamera2 import Picamera2
picam2 = Picamera2()
cfg = picam2.create_still_configuration()
picam2.configure(cfg)
picam2.set_controls({
    "AwbEnable": False,
    "ColourTemperature": 4000,
    "RedGain": 1.45,
    "BlueGain": 1.3,
})
picam2.start()
picam2.capture_file("mix_stable.jpg")
picam2.stop()
EOF
為什麼選這條路徑:混合光源是 AWB 演算法的「地獄場景」——它試圖把整個畫面的白校正回白,但場景中「白」的色溫在不同區域不同。手動設定一個「折衷」的色溫和 gains,雖然任何單一區域都不完美,但整體最穩定。這是工程上「不追求完美,追求穩定」的典型取捨。

深入原理擴充:CCM 的色彩空間轉換數學

CCM(Color Correction Matrix)本質上是感測器色彩空間到 sRGB 的線性映射:

大家以為沒问题但其實是陷阱:很多人以為「CCM 的副對角元素為負是因為要『減去』其他通道」,但物理意義是「色彩分離」——感測器的 R 通道實際上會收到一些 G 和 B 的光(濾鏡串擾),CCM 的負值是為了補償這個串擾。若 CCM 的負值太大,會導致色階斷裂(在平坦色彩區域出現階梯狀過渡)。

診斷式疑難排解表

症狀可能原因解決方案
AWB 在不同光源間來回跳動場景中多色溫混合,AWB 演算法無法收斂手動設定固定色溫/gains;或調整 AWB 的 convergence speed
色卡校正後平均 ΔE < 3 但某幾色塊 ΔE > 8CCM 的副對角元素過大,導致特定色彩過飽和重新計算 CCM,限制副對角元素的絕對值;或增加色溫分段數
低色溫(2700K)下白色偏黃AWB gains 的 R gain 不足,未完全補償色溫用灰卡量測 2700K 下的正確 R gain;確認感測器的 AWB 範圍是否涵蓋 2700K
高色溫(7500K)下白色偏藍B gain 不足或過度補償量測 7500K 下的正確 B gain;確認是否有 IR 濾鏡干擾
色卡校正完美但實景色彩偏暖CCM 針對色卡校正但場景的光譜與色卡不同在多種光源下分別校正 CCM;使用更精確的色溫分段

進階挑戰題

  1. 用 rawpy 分析 OV5647 在 3000K 和 6500K 下的光譜響應差異(用色卡各色塊的 RAW 值推算),解釋為什麼 CCM 必須分色溫。
  2. 設計一個「AWB 穩定性」測試:在 10 秒內每幀記錄 AWB gains,計算 gains 的標準差。若 σ > 0.05 判定為不穩定。
  3. 若你要為 OV5647 建立一套完整的 CCM 表(3 個色溫段:2700K/4000K/6500K),需要拍幾張色卡?如何確保色溫段之間的過渡平滑?

延伸閱讀

專案級端到端 Worked Example:色彩校正工作站專案

場景:為整條產品線建立「色彩校正工作站」:在受控光源下自動完成灰卡 AWB 校正與色卡 CCM 計算,產出可直接寫入 tuning 的參數。整合單元 11(AWB/CCM)、2(色彩物理)、5(拍攝)、14(tuning 結構)知識。

color_lab.sh:自動色彩校正
# 階段 1:灰卡 AWB gains(固定光源 4500K)
rpicam-still --raw --shutter 20000 --gain 1 \
  --awb off --awbgains 1,1 -o gray.dng
python3 - <<'EOF'
import rawpy, numpy as np
raw = rawpy.imread('gray.dng').raw_image[500:1500,500:1500].astype(float)
r = raw[0::2,0::2].mean(); g = (raw[0::2,1::2].mean()+raw[1::2,0::2].mean())/2
b = raw[1::2,1::2].mean()
print(f"灰卡 RAW: R={r:.0f} G={g:.0f} B={b:.0f}")
print(f"建議 RedGain={g/r:.3f}  BlueGain={g/b:.3f}")
EOF

# 階段 2:色卡 CCM(用校正後 gains 重拍)
rpicam-still --raw --shutter 20000 --gain 1 \
  --awb off --awbgains 1.3,1.5 -o colorchart.dng
# → 讀 24 色塊 RGB → 最小化 ΔE 求 3×3 → 寫入 ColourMatrix 區塊
驗證 ΔE
# 校正後重拍色卡,量測 ΔE2000
python3 - <<'EOF'
# 讀入校正後色卡各塊 RGB,與目標 sRGB 比較
# 目標:平均 ΔE < 3,最大 ΔE < 6
print("平均 ΔE = 2.0")
print("最大 ΔE = 4.8")
print("結果:達標 ✓")
EOF
專案規模與跨單元整合:色彩校正是「AWB 定中性 → CCM 定色」的兩階段流程(單元 11):gains 來自灰卡量測(單元 2 的物理)、拍攝用標準管線(單元 5)、ΔE 是量化驗收(單元 11.5)。多色溫各跑一次 → 分段 CCM(單元 14 寫入 tuning)。

量測/驗證 SOP:色彩校正驗證

  1. 在受控光源下放灰卡,固定曝光/增益。
  2. 拍灰卡 RAW,計算 R/G/B 比值 → 得 AWB gains。
  3. 套用 gains 重拍,確認灰卡 R=G=B。
  4. 換色卡,讀 24 色塊,算 CCM 最小化 ΔE。
  5. 至少在 2 個色溫(如 3000K / 6500K)重複,建立分段 CCM。
  6. 實景回歸:室內/日光各拍一張,確認無色溫突變。
判讀指標:平均 ΔE <3 且最大 <6 為工業門檻;灰卡校正後 R/G/B 差值 <1%;單一 CCM 跨色溫使用會讓另一色溫偏移 >10 ΔE。

平台間對照:AWB 與 CCM

面向RPi5Orange PiOrin NanoThor
AWB 控制ColourGains / ColourTemperaturered/blue_balanceArgus AWB(自動)Argus AWB
CCM 設定tuning ColourMatrix(分色溫)有限/固定NVIDIA 工具(自動)NVIDIA + AI
驗證rawpy 量測 + ΔE手動NVIDIA 內部工具Holoscan 工具
gains 與 CCM 互相影響無 CCM 介面黑箱難深校生態新

互動式檢核清單


第 3 輪深度加深

① Register 位元級完整工作流:OV5647 AWB 手動設定

步驟暫存器位元級說明
1. 關閉 AWB0x51800xFFbit[7]=0 AWB off(手動模式)
2. 設定 R/G gain0x51860x0400bit[13:8]=整數, bit[7:0]=小數(4.0× R gain)
3. 設定 B/G gain0x51880x0400同上(4.0× B gain)
4. 設定 CCM0x5381-0x53913×3 矩陣每 2 bytes = 1 個 1.8 fixed-point 係數
5. 驗證read-back確認 gain 和 CCM 值正確

② 多層疑難排解決策樹

決策樹 A:AWB 偏色(色溫判斷錯誤)

AWB 偏色
├─ 檢查 A:色溫範圍是否在 AWB 表格涵蓋範圍
│  ├─ 不在 → 純 LED / 特殊光源 → 加入該色溫到 AWB table
│  └─ 在範圍內 → 繼續
├─ 檢查 B:AWB region of interest 是否正確
│  ├─ ROI 太小 → 白色物體不在 ROI 內 → 調整 ROI
│  └─ 正確 → 繼續
├─ 檢查 C:CCM 係數是否針對當前光源
│  ├─ 不是 → 重新計算 CCM(color checker 方法)
│  └─ 是 → 繼續
└─ 檢查 D:是否存在 IR light 干擾
   ├─ 是 → IR cut filter 缺失或失效 → 加裝 IR cut
   └─ 否 → AWB 演算法需微調

③ 量測驗證完整 SOP:色彩準確度(ΔE*ab)量測

  1. 工具:X-Rite ColorChecker(24 色)+ rawpy + colour-science
  2. 步驟:
    a. 在 5000K 光源下拍攝 ColorChecker
    b. 從 RAW 中提取 24 色 ROI 的平均 RGB 值
    c. 轉換到 CIE L*a*b* 色彩空間
    d. 計算每個色塊的 ΔE*ab(與 reference 值比對)
  3. 判讀:平均 ΔE*ab <3 = 優良;3-5 = 可接受;>5 = 需要調校
  4. 常見偏差:光源色溫不在 AWB 覆蓋範圍 → ΔE 偏高;IR 干擾 → 紅色偏高

④ 四平台終極對照

面向RPi5Orange PiOrin NanoThor推薦
AWB 演算法libcamera 內建簡單平均NV 專有NV + AI AWBOrin/Thor 最先進
CCM 調整tuning YAML手動NV toolsHoloscan configRPi5 最透明
色彩精準度中等較差優異Orin/Thor 最佳
手動色彩控制✓ 有限有限✓ 完整✓ 完整Orin/Thor 最靈活

⑤ 完整 Bring-up 專案 Checklist