gains、灰卡校正、CCM 實作
人眼會適應色溫,感測器不會。AWB 演算法算出一組 gains,讓中性色(灰/白)在中性。
| 光源 | 色溫(K) | 視覺 | AWB 傾向 |
|---|---|---|---|
| 燭光 | ~1900 | 很黃 | 提升 R gain |
| 白熾燈 | ~2700–3200 | 黃 | 提升 R gain |
| 日光燈 | ~4000–5000 | 中性偏冷 | 微調 |
| 日光 | ~5500–6500 | 中性 | gains ≈ 1 |
| 陰影/陰天 | ~7000+ | 藍 | 提升 B gain |
picam2.set_controls({
"AwbEnable": False,
"ColourTemperature": 4500,
"RedGain": 1.6, # 先設中性 1.0 再逐步調整
"BlueGain": 1.2,
})感測器的色彩響應不完美(濾鏡串擾、響應曲線偏移),用 3×3 矩陣校正到標準色彩空間(sRGB/Rec.709)。分色溫兩套(低色溫/高色溫)因為感測器響應隨光譜不同。
{ {1.6, -0.3, -0.3},
{-0.2, 1.4, -0.2},
{-0.1, -0.3, 1.4} }# 用 deltaE2000 比較校正前後與目標色卡的色差
python3 - <<'EOF'
# 以 colour-science 或自寫 deltaE2000
# 目標:平均 ΔE < 3(工業常用門檻)
# 各色塊最大 ΔE < 6
EOF3000K: 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。實際值隨感測器/鏡頭而異,用灰卡實測。
感測器對不同光譜(低/高色溫)的響應曲線不同 → 單一 CCM 無法同時校正兩種光源 → 分兩套(低溫/高溫)並依 AWB 色溫插值。
場景:你的場景同時有窗外日光(6500K)和室內白熾燈(2700K),AWB 演算法在兩者之間來回跳動。需要找到一個穩定的 gains 組合。
# 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()
EOFCCM(Color Correction Matrix)本質上是感測器色彩空間到 sRGB 的線性映射:
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| AWB 在不同光源間來回跳動 | 場景中多色溫混合,AWB 演算法無法收斂 | 手動設定固定色溫/gains;或調整 AWB 的 convergence speed |
| 色卡校正後平均 ΔE < 3 但某幾色塊 ΔE > 8 | CCM 的副對角元素過大,導致特定色彩過飽和 | 重新計算 CCM,限制副對角元素的絕對值;或增加色溫分段數 |
| 低色溫(2700K)下白色偏黃 | AWB gains 的 R gain 不足,未完全補償色溫 | 用灰卡量測 2700K 下的正確 R gain;確認感測器的 AWB 範圍是否涵蓋 2700K |
| 高色溫(7500K)下白色偏藍 | B gain 不足或過度補償 | 量測 7500K 下的正確 B gain;確認是否有 IR 濾鏡干擾 |
| 色卡校正完美但實景色彩偏暖 | CCM 針對色卡校正但場景的光譜與色卡不同 | 在多種光源下分別校正 CCM;使用更精確的色溫分段 |
場景:為整條產品線建立「色彩校正工作站」:在受控光源下自動完成灰卡 AWB 校正與色卡 CCM 計算,產出可直接寫入 tuning 的參數。整合單元 11(AWB/CCM)、2(色彩物理)、5(拍攝)、14(tuning 結構)知識。
# 階段 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 區塊
# 校正後重拍色卡,量測 ΔE2000 python3 - <<'EOF' # 讀入校正後色卡各塊 RGB,與目標 sRGB 比較 # 目標:平均 ΔE < 3,最大 ΔE < 6 print("平均 ΔE = 2.0") print("最大 ΔE = 4.8") print("結果:達標 ✓") EOF
| 面向 | RPi5 | Orange Pi | Orin Nano | Thor |
|---|---|---|---|---|
| AWB 控制 | ColourGains / ColourTemperature | red/blue_balance | Argus AWB(自動) | Argus AWB |
| CCM 設定 | tuning ColourMatrix(分色溫) | 有限/固定 | NVIDIA 工具(自動) | NVIDIA + AI |
| 驗證 | rawpy 量測 + ΔE | 手動 | NVIDIA 內部工具 | Holoscan 工具 |
| 坑 | gains 與 CCM 互相影響 | 無 CCM 介面 | 黑箱難深校 | 生態新 |
| 步驟 | 暫存器 | 值 | 位元級說明 |
|---|---|---|---|
| 1. 關閉 AWB | 0x5180 | 0xFF | bit[7]=0 AWB off(手動模式) |
| 2. 設定 R/G gain | 0x5186 | 0x0400 | bit[13:8]=整數, bit[7:0]=小數(4.0× R gain) |
| 3. 設定 B/G gain | 0x5188 | 0x0400 | 同上(4.0× B gain) |
| 4. 設定 CCM | 0x5381-0x5391 | 3×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 演算法需微調
| 面向 | RPi5 | Orange Pi | Orin Nano | Thor | 推薦 |
|---|---|---|---|---|---|
| AWB 演算法 | libcamera 內建 | 簡單平均 | NV 專有 | NV + AI AWB | Orin/Thor 最先進 |
| CCM 調整 | tuning YAML | 手動 | NV tools | Holoscan config | RPi5 最透明 |
| 色彩精準度 | 中等 | 較差 | 優 | 優異 | Orin/Thor 最佳 |
| 手動色彩控制 | ✓ 有限 | 有限 | ✓ 完整 | ✓ 完整 | Orin/Thor 最靈活 |