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

NVIDIA AWB/CCM

NVIDIA AWB

NVIDIA ISP 自動白平衡依統計調整 R/G/B gains,也可手動設定色溫。

Argus WhiteBalance(示意)
AWB_AUTO / AWB_MANUAL + 色溫或 gains

CCM 與色彩

實務:先讓感測器「中性」出圖,再交 NVIDIA AWB/CCM 自動化——避免兩端色彩打架。

11.6 深入:白平衡實作

控制 AWB
Argus AWB_MANUAL + gains
  1. 拍灰卡,手動調 gains 直到 R=G=B。
  2. 記錄該色溫的 gains。
  3. 不同色溫重複 → 建表。
陷阱:感測器端 AWB 對混合色溫不準;要精準色彩,關閉感測器 AWB、改平台端做。

11.7 練習

  1. 灰卡校正一組 gains。
  2. 對比「開 AWB」與「關 AWB 手動」的結果。
看完這單元你應該能說出:
  • NVIDIA AWB 自動/手動。
  • CCM 與色溫分段。
  • 「感測器中性 → NVIDIA 色彩」分工。
  • NVIDIA 色彩調校可視性限制。

11.8 深入原理:色溫與 AWB 增益的關係

色溫(開爾文)描述光源顏色:低色溫(3200K 鎢絲燈)偏橙紅,高色溫(6500K 日光)偏藍。感測器的 R/G/B 通道對各光源敏感度不同,AWB 算出每個通道的增益讓灰卡在影像中「看起來灰」。

光源色溫R 增益傾向B 增益傾向
鎢絲燈~3200K低(紅多)
日光~5500–6500K
陰影/藍天~7500K+
AWB 的本質:它假設場景中有些像素是「灰的」來估計光源。若場景全是單一彩色,估計就會偏——這就是「讓 AWB 自動跑」也要注意場景的原因。

11.9 Worked Example:灰卡 AWB 校正

灰卡手動校正流程
# 1. 關 AWB(固定 gains)
Argus: AWB_MANUAL  R_gain=1.0 B_gain=1.0
# 2. 拍灰卡,讀 R/G/B 平均
#    (用 RAW 或 NV12 的灰卡區)
python3 - <<'EOF'
# r,g,b = 灰卡區三通道平均
# 目標 r' == g' == b'
# 調整因子:R_new = R * (G/R),  B_new = B * (G/B)
EOF
# 3. 寫回 gains,重拍確認 R≈G≈B
Argus: AWB_MANUAL  R_gain=1.12 B_gain=1.48   # 範例值
實務紀律:灰卡要佔畫面主體、光線均勻、不要有反光;同一個校正結果只對「同光源」有效——換光源要重校,並把結果建表。

11.10 疑難排解決策樹:色彩偏掉

決策樹
1. 整張偏紅/偏藍?
   ├─ 是 → AWB 光源估計錯:換場景/重校
   └─ 否 ┐
2. 局部偏色(角落)?
   ├─ 是 → 是 lens shading 造成 → 進 LSC(單元 12)
   └─ 否 ┐
3. 特定色不準(綠不綠/皮膚怪)?
   ├─ 是 → CCM 色彩矩陣問題 → 需 tuning 資料
   └─ 否 ┐
4. 灰卡上 R≠G≠B?
   ├─ 是 → 重做 AWB 校正(11.9)
   └─ 否 → ✅ 色彩正常

11.11 常見錯誤 / 陷阱

陷阱 ①:感測器端與平台端同時開 AWB → 兩端增益疊加、色彩打架。用 NVIDIA 端做 AWB 時,感測器側要維持中性。
陷阱 ②:用「已處理」影像(NV12)校色——應以 RAW 或一致輸出為準,避免 ISP 級數干擾判讀。
陷阱 ③:混合色溫場景(窗邊+燈泡)AWB 永遠不準——這種場景該鎖定手動色溫。

11.12 練習

  1. 做一組灰卡校正,記錄 gains。
  2. 在 3200K / 5500K 兩光源各校一次,比較差異。
  3. 解釋「為什麼全紅場景 AWB 會失敗」。

11.13 進階:灰卡校正的誤差控制

灰卡校正的成敗在「灰卡是否真的中性」。常見誤差來源:灰卡髒污、光不均、反光、卡太小。校正時要求:卡佔畫面中央 30% 以上、光源均勻、避免眩光、相機正對卡。

校正品質檢查
# 校正後灰卡區 R/G/B 差異應 < 2%(同光源)
r, g, b = 灰卡區三通道均值
print('R/G:', r/g, ' B/G:', b/g)   # 應都接近 1.0
# 四角也抽樣:角落偏色 → 那是 LSC 的事(單元 12)

11.14 快速參考:色彩除錯小抄

症狀先查
整張偏紅/偏藍AWB 光源估計
角落偏色LSC 分通道(12)
單色不準CCM / tuning
灰卡 R≠G≠B重做 AWB 校正
混合色溫怪色改手動色溫

11.15 看完本單元該記住的三件事

AWB 依統計估光源,場景會騙它。
感測器維持中性,色彩交給 NVIDIA AWB/CCM——不要兩端打架。
灰卡校正結果要隨光源建表。

11.16 Worked Example:CCM 的效果檢驗

CCM(色彩校正矩陣)把感測器 RGB 轉成目標色彩空間。判斷「要不要動 CCM」:拍標準色卡(如 Macbeth),看特定色塊誤差。

色卡檢查流程
1. 拍標準色卡(灰卡校正 AWB 後)
2. 量 R/G/B/Y 等色塊的 RGB 值
3. 對照標準值算 ΔE
4. ΔE 大 → 需要 CCM 級校正(NVIDIA tuning)
5. ΔE 小 → 不用動,避免過度校正
紀律:先 AWB(灰卡)再談 CCM——AWB 沒做好時,CCM 只會把偏差「複製」成更怪的色彩。

11.17 看完本單元該記住的三件事

AWB 估光源、CCM 修色彩空間,先後不同。
感測器中性 + NVIDIA 色彩,避免兩端打架。
深色校色需 NVIDIA 內部 tuning,介面是有限的。

延伸閱讀

11.9 進階真實情境 Worked Example:室內/室外混合光源的 AWB 挑戰

場景:相機安裝在工廠入口,畫面同時有室內日光燈(色溫 ~4000K)和室外日光(~5500K)。AWB 需要在「兩種色溫共存」時保持自然。

Argus AWB 手動校正
# 1. 先讓 auto AWB 收斂(觀察它偏向哪種色溫)
argus_camera --mode 0 --awb-auto --duration 5
# 2. 若 auto 偏向室外(日光範圍大),手動設定色溫
argus_camera --mode 0 --awb-manual --color-temperature 4500
# 3. 用灰卡量測 CCM 殘差
#    18% 灰卡 RGB 應接近 (128,128,128)
#    若偏暖(R > B)→ 降低色溫設定
#    若偏冷(B > R)→ 提高色溫設定
# 4. 最終目標:灰卡在所有光源下色彩偏差 < 5%(ΔE < 5)

設計決策:混合光源是 AWB 的終極挑戰——auto AWB 只能「選一種」色溫當 white point。工業場景若光源穩定(日光燈+日光比例固定),手動設定色溫比 auto 更穩定。

11.10 深入原理擴充:CCM 的「色域映射」角色

CCM(Color Correction Matrix)不只是「調色彩」,它本質上是把感測器的「RGB 色域」映射到標準色彩空間(如 sRGB)。

步驟說明為什麼重要
1. 拍 24 色色卡取得「感測器 RGB」vs「標準 XYZ」的對應這是 CCM 計算的 input
2. 計算 3×3 CCM最小二乘法求最佳映射CCM 的每行加總 ≈ 1(色彩守恆)
3. 載入 ISP每個 pixel 都乘以 CCM即時校正,不耗 CPU
陷阱:「拍白色物體,調整 CCM 讓它看起來白」——這是直覺但不正確。正確做法是拍標準色卡,讓 CCM 同時校正所有顏色(R/G/B 的 cross-talk),而不只是「讓白色更白」。只對白色調 CCM 會讓其他顏色偏移。

11.11 診斷式疑難排解表

症狀可能原因解決方案
AWB 在日光燈下偏綠AWB 的 green 偏移未校正(或 CCM 的 green cross-talk 過大)用色卡重新計算 CCM;確認 CCM 的 green 行加總 ≈ 1
AWB 在低光下偏紫低光 gain 放大 UV 雜訊,AWB 誤判色溫在低光下降低 AWB 靈敏度;或手動固定色溫
手動設定色溫後畫面偏黃設定的色溫值不準確(燈具老化/型號差異)用色溫計量測實際光源色溫;或用灰卡校正
AWB 在室內/室外切換時「跳色」AWB 的 response time 太快,對短暫色溫變化過度反應提高 AWB 的 temporal smoothness;或用 hysteresis 避免頻繁切換
CCM 載入後畫面色彩「過飽和」CCM 計算時色卡拍攝不標準(光源不均、角度不對)確保色卡在均勻光源下正對鏡頭拍攝;重算 CCM

11.12 進階挑戰題

  1. 用 24 色色卡在 3 種不同光源(日光、日光燈、LED 暖白)下各拍一張 RAW,分別計算 CCM,比較三個 CCM 的差異。
  2. 設計一個「AWB 響應速度測試」:在已知色溫切換點(例如 LED 燈切換色溫),計時 AWB 從一個色溫目標到另一個目標的收斂時間。
  3. 若你的 CCM 計算工具回傳的 CCM 行加總不等於 1,解釋為什麼這會導致色彩偏移,並寫出修正公式。

11.13 專案級端到端 Worked Example:色彩校準專案

場景:產品要出貨,客戶要求色彩一致(ΔE < 5)。專案目標:完成「灰卡 AWB + 色卡 CCM」的完整色彩校準,並在多種光源下回歸。

校準專案流程
# Phase 1 · 感測器中性化(先決條件)
#   確認感測器端 AWB 關閉、黑位正確(回顧單元 8)
# Phase 2 · 灰卡 AWB(每種光源各一次)
argus_camera --mode 0 --raw-file gray_5500k.raw --duration 1
#   讀灰卡區 R/G/B,算 gains 讓 R≈G≈B(回顧 11.9)
#   結果建表:5500K → R_gain / B_gain
# Phase 3 · 色卡 CCM(每種光源各一次)
argus_camera --mode 0 --raw-file cc_5500k.raw --duration 1
#   量 24 色塊 vs 標準值,最小二乘求 3×3 CCM(回顧 11.10)
# Phase 4 · 驗證
#   重新拍灰卡 / 色卡,確認 R≈G≈B 且 ΔE < 5
# Phase 5 · 回歸
#   3200K / 5500K / 日光燈 三種光源全跑,記錄各光源的 gains + CCM

專案輸出:光源 →(AWB gains, CCM)對照表 + 每光源 ΔE 報告。這就是量產 firmware 要載入的色彩檔。

11.14 量測/驗證 SOP:色彩驗證

  1. 前置:感測器端 AWB 關閉、感測器維持中性。
  2. 灰卡校正:灰卡佔畫面 ≥ 30%、光均勻、無反光;校正後 R/G、B/G 接近 1.0。
  3. 色卡驗證:拍標準色卡,量各色塊 ΔE。
  4. 光源回歸:每種目標光源獨立校正與驗證。
  5. 混合光源:窗邊 + 燈泡場景,考慮鎖定手動色溫。
  6. 陷阱檢查:確認感測器與平台端沒有「兩端同時開 AWB」。
驗收指標:灰卡 R≈G≈B、色卡 ΔE < 5(同光源)、光源間無跳色。

11.15 平台間對照:AWB / CCM

面向Orin NanoRPi5Orange PiThor
AWB 介面Argus AWB(auto/manual)ColourGainsred / blue_balanceArgus AWB
CCM 載入NVIDIA tuningtuning file感測器內建NVIDIA tuning
手動色溫✅ 可鎖定✅ 可設定⚠️ 有限✅ 可鎖定
演算法可視性低(黑箱)高(可改)
校正工具灰卡 / 色卡 + 自寫腳本全平台通用
重點:色彩校正的「方法」全平台相同(灰卡 → AWB、色卡 → CCM);差異在「參數從哪個介面載入」——Orin / Thor 走 NVIDIA tuning,RPi5 走 tuning file。

11.16 互動式檢核清單:色彩驗收

11.13 Register 位元級完整工作流:AWB 驗證——灰卡 + 色偏量測

步驟Command / 量測預期(AWB ON)預期(AWB OFF)
1. 灰卡出圖argus + X-Rite 灰卡R ≈ G ≈ B色偏(依光源)
2. RGB ratiomean(R)/mean(G), mean(B)/mean(G)均 ≈ 1.0偏離 1.0
3. 色溫估計色度座標 → 色溫≈ 光源色溫偏離光源色溫
4. 30 幀穩定性std of RGB ratiostd < 0.02固定(std ≈ 0)
AWB 完整驗證腳本
#!/usr/bin/env python3
# awb_verify.py — 驗證白平衡功能
import numpy as np, subprocess, glob

def capture_and_analyze(label):
    subprocess.run([
        "argus_camera", "--camera-id", "0", "--mode", "0",
        "--capture-auto", "1", "--duration", "1",
        "--output-dir", f"/tmp/awb_{label}"
    ], capture_output=True)
    raw = glob.glob(f"/tmp/awb_{label}/*.raw")
    if not raw:
        return None
    data = np.fromfile(raw[0], dtype=np.uint16).reshape(800, 1280)
    r, g, b = data[0::2, 0::2], data[0::2, 1::2], data[1::2, 0::2]
    return {"R": r.mean(), "G": g.mean(), "B": b.mean()}

# Test: Gray card under daylight
result = capture_and_analyze("graycard")
if result:
    rg = result["R"] / result["G"]
    bg = result["B"] / result["G"]
    print(f"R/G = {rg:.3f} (should be ~1.000)")
    print(f"B/G = {bg:.3f} (should be ~1.000)")
    
    deviation = abs(rg - 1.0) + abs(bg - 1.0)
    if deviation < 0.05:
        print("AWB VERDICT: PASS (neutral)")
    elif deviation < 0.10:
        print("AWB VERDICT: MARGINAL (slight cast)")
    else:
        print("AWB VERDICT: FAIL (color cast)")

11.14 多層疑難排解決策樹

決策樹 A:AWB 偏色
1. 灰卡拍出偏暖(R > G > B)?
   ├─ 是 → 色溫估計過低 → 提高色溫
   │       或 CCM 暖色係數過高 → 降暖色增益
   └─ 否 ┐
2. 灰卡拍出偏冷(B > G > R)?
   ├─ 是 → 色溫估計過高 → 降低色溫
   │       或 CCM 冷色係數過高 → 降冷色增益
   └─ 否 ┐
3. 灰卡拍出偏綠?
   ├─ 是 → CCM 綠色通道增益過高
   │       或 AWB 色溫估計錯誤
   └─ 否 → 色彩正常
決策樹 B:AWB 跳動
1. 畫面色彩快速閃爍?
   ├─ 是 → AWB 收斂速度太快 → 降 speed
   │       或光源 flicker → 開 flicker rejection
   └─ 否 ┐
2. 色彩偶爾突然偏移?
   ├─ 是 → AWB 參考區域有異常色 → 限定 ROI
   └─ 否 ┐
3. 色彩穩定但不準?
   ├─ 是 → 校正不足 → 執行白平衡校正
   └─ 否 → AWB 正常

11.15 量測驗證完整 SOP

  1. 校正用灰卡:X-Rite ColorChecker 或 18% 灰卡,均勻打光(色溫 5500K)。
  2. AWB 出圖argus_camera --capture-auto 1 --duration 1 → 灰卡 RAW。
  3. RGB ratio:R/G、B/G 應均 ≈ 1.000;偏離 > 0.05 需追查。
  4. 色溫估計:由色度座標推算色溫;應 ≈ 光源色溫(5500K)。
  5. 色彩穩定性:30 幀,每幀算 RGB ratio;std < 0.02 = PASS。
  6. CCM 驗證:若可調,修改 CCM 一個係數 → 出圖 → 確認色彩變化。
  7. AWB OFF 比較:手動固定色溫 → 與 AWB 自動結果比對。
判讀標準:灰卡 RGB ratio 均 ≈ 1.0 ✓、色溫估計準確 ✓、30 幀 std < 0.02 ✓ = AWB 正常。

11.16 四平台终极對照

面向Orin NanoRPi5Orange PiThor推薦
AWB 實作3A librarylibcamera 3A無 / 有限3A + Holoscan各有實現
AWB 色溫範圍2300-10000K2500-7500K有限2000-12000K全光譜 → Thor
CCM 可調✅ 3×3 矩陣✅ tuning file✅ + AI校正 → Orin
AWB 穩定性良好良好最佳室外 → Orin/Thor
校正工具NVIDIA tuninglibcamera 向導NVIDIA + Holoscan各有工具
多光源支援✅ 混合光源✅ 混合光源有限✅ + AI 識別複雜光源 → Thor
AWB 學習曲線中高入門 → RPi5

11.17 完整 Bring-up 專案 Checklist