NVIDIA AWB/CCM
NVIDIA ISP 自動白平衡依統計調整 R/G/B gains;也可手動設定色溫。
AWB_AUTO / MANUAL + 色溫
Argus AWB_MANUAL + gains
AWB 的基礎是灰世界假設:場景平均應接近灰(R=G=B)。感測器在色溫變化下,R/B 通道增益要補償才能回到灰。
| 色溫 | 灰卡下 RAW 比例(R:G:B) | 需要的增益 |
|---|---|---|
| 日光 6500K | 1.0 : 1.0 : 1.0 | gR≈1.0, gB≈1.0 |
| 暖白 3000K | 1.4 : 1.0 : 0.7 | gR≈0.7, gB≈1.4 |
| 冷色 10000K | 0.8 : 1.0 : 1.3 | gR≈1.25, gB≈0.77 |
拍灰卡,讀 RAW 四通道平均: R=700, Gr=500, Gb=520, B=400(10-bit) 目標:R' = G' = B' = 某基準 gR = Gr/R = 500/700 ≈ 0.71 gB = Gr/B = 500/400 = 1.25 基準用 Gr 通常最穩(兩綠通道平均)
AWB gains(感測器/ISP 前段) → CCM(3×3 色彩矩陣,把感測器原生色域轉到目標色域) → Gamma(人眼感知非線性) → 輸出 # 判斷順序錯的徵兆: # 調整 AWB 後 CCM 也要重調,表示你改動順序搞混了
1. 中性場景偏某一色? ├─ 關 AWB 手動設灰卡 → 驗證感測器本身 ├─ 仍偏 → CCM / 黑位(unit-07) └─ 變正常 → AWB 沒收斂 / 混合色溫 2. 高光區偏色? └─ 色階 clipping 或 gamma 3. 換 mode 後偏色? └─ sensor mode 的 gains 表沒同步(unit-08)
AWB 不是把整張圖變白,而是從可信的中性區域估計照明色。ISP 通常先排除飽和、高彩度與陰影像素,再以區域統計求 R/G、B/G 比例;色溫只是這個比例的索引,不是感測器直接量到的物理溫度。CCM 再把感測器原生色域映射到輸出色域。
| 量測 | 可信條件 | 失效症狀 |
|---|---|---|
| R/G、B/G | 灰卡或中性物、未飽和 | 整體偏色 |
| 灰階軸 | 多個亮度區間都接近中性 | 高光或暗部單獨偏色 |
| CCM 色塊誤差 | 固定光源與曝光 | 特定色相偏移 |
灰卡 RAW 平均:R=700, Gr=500, Gb=520, B=400 G基準 = (Gr + Gb) / 2 = 510 gR = 510 / 700 = 0.729 gG = 1.000 gB = 510 / 400 = 1.275 套用後:R'≈510、G'≈510、B'≈510 驗證:避開飽和區,重拍三個亮度級;若比例只在某一級成立,查 clipping、黑位或 sensor gain 格式。 不要把 gR/gB 直接當成 CCM 係數,CCM 是 3×3 矩陣。
1. RAW 四通道比例已不平衡? ├─ 是 → sensor gains、黑位、Bayer 或 LSC └─ 否 ─┐ 2. 關 AWB 後灰卡仍偏色? ├─ 是 → CCM、gamma、輸出色域或 channel order └─ 否 ─┐ 3. 灰卡正常、色卡特定色塊錯? ├─ 是 → CCM / 色域映射 └─ 否 ─┐ 4. 只有混合光源錯?→ AWB ROI、主光源選擇與收斂策略
場景:Thor T5000 搭載在手術機器人上,手術室同時有日光燈(5000K)與手術燈(4000K 暖色)。AWB 需要在兩種色溫之間找到平衡,不讓手術區域偏色。
# 問題:全畫面 AWB 被大面積日光燈主導 → 手術燈區域偏暖 # 或被手術燈主導 → 日光燈區域偏冷 # 方案:ROI-based AWB # 1. 定義兩個 AWB ROI: # ROI_A(手術區域):優先級高,色溫目標 4000K # ROI_B(背景):優先級低,色溫目標 5000K # 2. ISP 統計分別計算兩個 ROI 的 R/G、B/G 比例 # 3. 最終 gains = 加權平均(ROI_A 權重 0.7、ROI_B 權重 0.3) # 驗證:拍 18% 灰卡放在手術區域,量測色彩 ΔE < 3(不可感知差異) # 設計決策: # 1. 手術場景對色彩精準度要求極高 → 必須用 ROI-based AWB # 2. ROI 與優先級必須手動定義(自動化無法理解「哪個區域重要」) # 3. CCM 必須在 AWB 收斂後才計算——AWB 與 CCM 有嚴格順序依賴
CCM(Color Correction Matrix)是一個 3×3 矩陣,把感測器原生色域(device-dependent)映射到輸出色域(通常是 sRGB)。AWB gains 是「pre-CCM」的通道縮放,CCM 是「post-AWB」的色彩旋轉。兩者數學上不可交換——先 AWB 再 CCM ≠ 先 CCM 再 AWB。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 灰卡上手動 AWB 正常但色卡特定色塊偏色 | CCM 矩陣未正確校正 / 色溫分段切換錯誤 | 在固定色溫下拍色卡,量測 ΔE;重新校正 CCM |
| 混合色溫場景中 AWB 不穩定(色溫來回跳動) | AWB ROI 設定不穩定 / 場景內容變動導致統計跳動 | 增加 AWB temporal smoothing;固定 ROI 或限制色溫變化範圍 |
| AWB gains 方向搞反(應降 R 卻升了) | 感測器 register 的 gains 定義是「乘在訊號上」vs「乘在 1/gain」 | 回讀 register 驗證方向;用灰卡實測 R/G/B 三通道變化 |
| 換光源後 AWB 需要 10 秒才收斂 | AWB convergence speed 設定過慢 / 統計 ROI 遮蔽主光源 | 提高 AWB reaction speed;確認 ROI 覆蓋主光源區域 |
| 手術燈下白色物體偏黃 | AWB 被手術燈色溫主導但 CCM 未針對該色溫校正 | 為手術燈色溫建立獨立的 CCM 校正值 |
場景:食品品質檢測專案要求 ΔE < 3。專案目標:建立「灰卡→AWB、色卡→CCM」的完整色彩校正流程並量化驗證。
M1 中性化感測器 ├─ 固定光源(D65 光源箱) ├─ 手動設 AWB gains 讓灰卡 R=G=B └─ 通過:灰卡四通道比例一致 M2 多色溫建表 ├─ 3000K / 5000K / 6500K 各拍灰卡 ├─ 各產一組 AWB gains └─ 通過:色溫-gains 對照表 M3 CCM 校正 ├─ 拍 Macbeth 色卡 ├─ 量測 24 色塊 ΔE └─ 通過:平均 ΔE < 3 M4 色溫分段驗證 ├─ 每色溫段各量一次 ΔE └─ 通過:所有段 ΔE < 5 M5 混合色溫 ├─ 定義 ROI 策略(unit-11.18) └─ 通過:主區域 ΔE < 3 M6 回歸 + 交付 └─ 通過:色溫-CCM 表進 repo + 重跑 SOP 文件 驗證: ΔE = 用 Lab 色彩空間比較色卡實際值 vs 標準值
Step 1 固定光源與曝光 光源箱(D65)+ 固定曝光 + 關自動 Step 2 灰卡 AWB 拍灰卡 → 讀 RAW 四通道 → 算 gains → 套用 Step 3 驗證中性 重拍灰卡 → R≈G≈B Step 4 色卡 CCM 拍 Macbeth → 量 24 色塊 → 建 CCM Step 5 ΔE 驗證 套 CCM 後重拍 → 算 ΔE(目標 < 3) Step 6 多色溫 + 回歸 3000/5000/6500K 各驗一次 判讀指標: RAW 四通道比例已失衡 → sensor gains / 黑位 / Bayer 灰卡正常但色卡錯 → CCM 只混合光源錯 → ROI 策略
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| AWB 控制 | Argus AWB(自動/手動色溫) | ColourGains | red/blue_balance | Argus AWB |
| CCM 可調性 | 受限(內部 tuning) | ✅ tuning JSON | ❌ 感測器內建 | 受限 |
| 色溫分段 | ✅ 內部自動 | ✅ 可設定 | ⚠️ | ✅ 內部自動 |
| ROI-based AWB | ✅ | ✅(部分) | ❌ | ✅ |
| 色彩調校深度 | 中(自動化協助) | 高(全開源) | 低 | 中 |
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
AWB_GAIN_R | 0x00140100 | AWB R channel gain | bit[15:0] = gain (8.8 fixed point) |
CCM_MATRIX | 0x00140200 | Color Correction Matrix | 3×3 matrix (signed 1.11 fixed point) |
# Step 1: 讀取目前值 $ devmem2 0x00140100 w # 記錄 current_value # Step 2: 計算新值(設定 bit[0]=1) $ new_value=$((current_value | 0x0001)) # Step 3: 寫入 $ devmem2 0x00140100 w $new_value # Step 4: 驗證 $ devmem2 0x00140100 w # 確認 bit[0] = 1,其餘 bit 不變 # Step 5: 進階 — bitmask 操作 $ read_val=$(devmem2 0x00140100 w | grep "Read" | awk '{print $NF}') $ mask=0x0001 $ expected=0x0001 $ [ $(($read_val & $mask)) -eq $expected ] && echo "PASS" || echo "FAIL: bit[0] not set"
1. 全面偏紅/偏綠? ├─ AWB 未收斂 → 檢查光源色溫是否在 AWB range └─ CCM matrix 不準 → 重跑白卡校正 2. 特定光源下偏色? ├─ AWB illuminant 列表不含該光源 → 手動設定 CCM └─ AWB 速度太慢 → 調 AWB speed factor
1. 校正後 ΔE > 5? ├─ 白卡拍攝角度不對 → 須正對光源、無反光 └─ ISP 前級設定不對 → BLC/LSC 未先校正 2. CCM 輸出超出 [0,1]? └─ 加 clamp 或調整 offset
AWB/CCM 完整校正 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 環境準備 | D65 lightbox + X-Rite ColorChecker | 光源 6500K ± 200K |
| Step 2 | BLC 先校正 | 拍暗場,設定 black level | 四通道偏差 < 2 DN |
| Step 3 | LSC 先校正 | 拍白板,生成 LSC table | 四角差 < 5% |
| Step 4 | AWB 開啟 | 拍白卡,啟用 AWB auto | AWB converged |
| Step 5 | 量測 AWB gain | 讀 AWB_GAIN_R/B 值 | 與 D65 預期值接近 |
| Step 6 | CCM 校正 | 拍 ColorChecker,套用校正 matrix | ΔE < 3 (avg) |
| Step 7 | 驗證多光源 | D50, TL84, A 光源各拍一張 | ΔE < 5 所有光源 |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| AWB 算法 | NVIDIA 3A (neural + heuristic) | libcamera AWB (heuristic) | 無(手動) | NVIDIA 3A |
| CCM 格式 | 3×3 + offset (signed 1.11) | 3×3 | N/A | 3×3 + offset |
| 校正工具 | NVIDIA ISP Visualizer | `raspistill --settings` | 手動 | NVIDIA ISP Visualizer |
| 支援光源數 | 10+ (D65, TL84, A, H 等) | 3–5 | 0(手動) | 8+ |
| AWB 收斂時間 | < 1 sec | 2–3 sec | N/A | 1–2 sec |
| 色彩空間轉換 | RGB→YCbCr + CCM | RGB→YCbCr | N/A | RGB→YCbCr + CCM |
針對「白平衡與色彩(AWB/CCM)」主題的完整 bring-up 步驟清單: