單元 14 · 清晰度、動態範圍與調校工作流

NVIDIA tuning 流程

清晰度與對比

動態範圍與 HDR

NVIDIA 調校工作流:① 感測器 init 正確 ② 出圖中性 ③ AE/AWB 自動收斂 ④ 依場景微調 ⑤ 回歸。強調「設定合理場景讓自動化做事」。

14.6 動態範圍與 HDR(本平台)

工程取捨:先量測場景動態範圍需求(亮/暗是否同時爆掉)再決定 HDR 或 tone mapping。

14.7 每次改動的記錄範本

tuning 改動 log
日期: ____  場景: ____
改動: 參數 A → B
原因: ____
結果: ____(量化)
回歸: ____ ✓/✗
附圖: ____
紀律:可重現的調校 = 完整 log。一次只改一個參數、統一場景比較。

14.6 深入:調校工作流與記錄

  1. 校正順序:黑位 → LSC → AWB/CCM → 曝光基準。
  2. 動態:AE/AWB convergence、banding。
  3. 美化:NR ↔ Sharpen。
  4. 回歸:室內/日光/逆光。
tuning log 範本
日期/場景/改動/原因/結果(量化)/回歸 ✓✗/附圖
紀律:一次只改一個參數、統一場景比較、完整記錄。

14.7 練習

  1. 建立 tuning 版本管理資料夾。
  2. 完成一輪「校正→美化→回歸」並記錄。
看完這單元你應該能說出:
  • NVIDIA 銳化/對比。
  • 多幀 HDR 與 tone mapping。
  • NVIDIA 調校工作流五步。
  • 「讓自動化做事」哲學。

14.8 深入原理:Sharpening 的雙面刃

銳化(unsharp mask 類)強化高頻邊緣,但也放大高頻雜訊;過度銳化會產生光暈(halo)——高對比邊緣旁的白色/黑色光邊。判斷標準:看高對比物(黑字白底)邊緣是否有光邊。

銳化 vs 雜訊的取捨
# 三個量測指標
# 1. 解析度:拍解析度測試卡,看能解到哪一線對
# 2. 雜訊:灰卡 RAW 的 σ(回顧單元 13)
# 3. 光暈:高對比邊緣的 overshoot 寬度
# 口訣:銳化升到「光暈出現前」為止
取捨紀律:先確定 SNR 足夠(單元 13),再調 sharpening;低 SNR 下銳化只會把雜訊變成「銳利的花」。

14.9 深入原理:HDR 與 tone mapping 的選擇

方案適用代價
多幀/多曝光 HDR靜態高動態場景運動會鬼影、需要合併時間
單幀 + tone mapping動態場景動態範圍受限,靠曲線壓縮
感測器原生 HDR(如行交錯)感測器支援時需感測器支援
工程判斷:先量「場景動態範圍」——亮暗是否同時爆掉。若只差 2–3 EV,tone mapping 就夠;差 6+ EV 才需要多幀 HDR。盲目開 HDR 反而引入鬼影與延遲。

14.10 疑難排解決策樹:高對比場景

決策樹
1. 亮部爆掉、暗部全黑?
   ├─ 是 → 量動態範圍需求
   │        ├─ ≤3 EV → 調 tone mapping / 曲線
   │        └─ >3 EV → 多幀 HDR(靜態)或接受取捨(動態)
   └─ 否 ┐
2. 暗部ok但亮部爆?
   ├─ 是 → 降曝光 / 開高光保護(tone)
   └─ 否 ┐
3. 亮部ok但暗部黑?
   ├─ 是 → 開陰影提升 / 補光
   └─ 否 → ✅ 平衡

14.11 常見錯誤 / 陷阱

陷阱 ①:動態場景硬開多幀 HDR → 鬼影 + 幀率下降,比沒 HDR 更糟。
陷阱 ②:tone mapping 硬拉暗部 → 把量化階調「拉斷」,暗部出現條帶。
陷阱 ③:每次調校不記錄 → 無法回歸比較,改壞了不知道。用 14.7 的 log 範本。

14.12 練習

  1. 做一次「銳化階梯」,找出光暈出現點。
  2. 量測一個高對比場景的 EV 範圍,判斷要 HDR 還是 tone mapping。
  3. 完成一輪完整的「校正→美化→回歸」並填 log。

14.13 進階:完整調校工作流的順序與理由

調校順序不是隨意的,每一級都依賴前一級正確:

黑位LSCAWB/CCM曝光基準NRSharpen回歸
為什麼在前面
黑位錯的黑位會污染所有亮度判斷
LSC不均勻的亮度會誤導 AWB/曝光統計
AWB/CCM色彩基準要先於「美化」
NR/Sharpen「美化」最後做,且互相牽制
回歸確認前面沒被後面弄壞
紀律:跳級調校 = 前面的錯誤會污染後面——例如黑位錯就做 AWB,之後怎麼校色都不對。

14.14 快速參考:調校小抄

症狀該動哪一級
暗部偏黑/浮灰黑位(8)
四角暗LSC(12)
色彩偏AWB/CCM(11)
顆粒NR / 增益(13)
不銳利Sharpen
亮暗爆掉HDR / tone(本單元)

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

調校順序:黑位 → LSC → AWB/CCM → 曝光 → 美化 → 回歸。
HDR 依動態範圍需求選,運動場景別硬開。
一次只改一個參數,log 完整才可回歸。

14.16 Worked Example:tone mapping 的量化驗證

量亮暗部是否同時保得住
# 拍含亮窗+暗室內的高對比場景
python3 - <<'EOF'
import numpy as np
# img: NV12 轉的亮度平面(或 RAW)
h, w = img.shape
dark = img[..., 200].mean()   # 暗部均值
brt  = img[..., 20].mean()    # 亮部(窗)均值
print('亮部', round(brt,1), '暗部', round(dark,1),
      '差', round(brt-dark,1))
# 暗部太低 → 陰影提升;亮部爆 → 高光保護
EOF
紀律:tone mapping 是「曲線」不是「魔法」——它犧牲對比換動態範圍。量化亮暗部數值再調,別憑感覺。

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

調校順序不可跳級。
HDR 依動態範圍需求選,運動場景慎用。
記錄 + 量化 + 一次一參數,才可回歸。

延伸閱讀

14.13 進階真實情境 Worked Example:完整 ISP 調校工作流(OV9281 + 廣角鏡頭)

場景:OV9281 搭配 120° 廣角鏡頭,需要完成從「出圖」到「量產級影像品質」的完整調校。

OV9281 完整調校 SOP
# Phase 1: 基礎設定(Day 1)
# 1.1 黑位校正(BLC):全遮鏡頭
argus_camera --mode 0 --raw-file black.raw --duration 1
# 計算黑位平均值 → 設定 BLC offset
# 1.2 LSC 校正:拍白牆
argus_camera --mode 0 --raw-file white.raw --duration 1
# 產生 LSC 校正表

# Phase 2: 色彩校正(Day 2)
# 2.1 AWB 校正:拍 X-Rite ColorChecker
argus_camera --mode 0 --raw-file colorchecker.raw --duration 1
# 計算 AWB gain + CCM
# 2.2 Gamma 校正:確保中間調自然
# 調整 gamma curve(通常 2.2)

# Phase 3: 雜訊/清晰度(Day 3)
# 3.1 NR 調校:低光/高光各拍一組
# 找到 NR level 的最佳平衡點
# 3.2 Sharpen 調校:拍 ISO 12233 解析度板
# 調整 sharpen level 避免 over/under sharpen

# Phase 4: 回歸測試(Day 4)
# 4.1 多場景測試:室內/室外/低光/高對比
# 4.2 量化指標:SNR、色彩偏差、動態範圍
# 4.3 記錄最終參數表

設計決策:調校順序很重要:BLC → LSC → AWB/CCM → Gamma → NR → Sharpen。每一步都依賴前一步的結果——例如 CCM 需要正確的 AWB gain 作為 input。

14.14 深入原理擴充:HDR 與動態範圍的「物理限制」

動態範圍(Dynamic Range)= 最亮可分辨亮度 / 最暗可分辨亮度。感測器的 DR 受限於:

限制因素說明突破方法
Full Well Capacitypixel 能容納的最大電子數用 HDR 模式(多曝光合成)
Read Noise讀取時的電子雜訊降低 analog gain(但犧牲感光度)
QuantizationADC 位元深(10-bit → 60dB 理論 DR)用 12-bit 或 14-bit ADC
陷阱:「HDR 模式可以無限提升 DR」——HDR 是用多曝光合成,有「運動模糊」和「幀率降低」的代價。在高速場景(如自駕車),HDR 的 ghosting(殘影)是嚴重問題。

14.15 診斷式疑難排解表

症狀可能原因解決方案
調校後影像比未調校更差調校順序錯誤(例如先做 Sharpen 再做 NR)嚴格遵循 BLC→LSC→AWB→Gamma→NR→Sharpen 順序
動態範圍不足(亮部過曝或暗部死黑)HDR 未啟用 或 sensor DR 夠用但 ISP 未處理確認 sensor 支援 HDR 模式;用 Argus 開啟 HDR
Sharpen 過度導致「光暈」(halo)sharpen level 過高 或 sharpen radius 過大降低 sharpen level;減小 radius(只 sharpen 邊緣)
Gamma 校正後中間調偏暗Gamma 值過大(例如 2.5 而非 2.2)調整 gamma 到 2.0-2.2 範圍;用中灰卡驗證
調校參數在不同場景間無法通用光源差異太大(日光 vs 日光燈)為每種光源建立獨立的調校 profile;或用 auto 模式 + 微調

14.16 進階挑戰題

  1. 為你的 OV9281 建立一份完整的「調校參數表」,涵蓋:BLC offset、LSC grid、AWB gain、CCM、Gamma、NR level、Sharpen level。每個參數附上量測方法。
  2. 設計一個「調校品質量化」腳本:從 RAW 出發,自動計算 SNR、色彩偏差(ΔE)、動態範圍、MTF(清晰度指標),並與「目標值」比較。
  3. 若你需要將調校參數從「開發環境」複製到「量產板」,設計一個參數打包/部署流程。

14.17 專案級端到端 Worked Example:量產級調校工作流專案

場景:OV9281 + 廣角鏡頭要從「能出圖」調到「量產級品質」(呼應 14.13 的 4 天流程)。專案目標:把這 4 天流程版本化、可重現、可回歸,成為團隊的調校 SOP 專案。

工作流專案(4 階段)
# Day 1 · 基礎設定:黑位 + LSC(回顧單元 8 / 12)
argus_camera --mode 0 --raw-file black.raw --duration 1   # 全遮 → BLC
argus_camera --mode 0 --raw-file white.raw --duration 1   # 白牆 → LSC
# Day 2 · 色彩:AWB + CCM(回顧單元 11)
argus_camera --mode 0 --raw-file cc.raw --duration 1      # 色卡 → gains + CCM
# Day 3 · 美化:NR + Sharpen(回顧單元 13 / 14)
#    NR level 階梯 + 解析度板 sharpen 階梯
# Day 4 · 回歸:多場景 + 量化指標
#    室內 / 室外 / 低光 / 高對比,量 SNR / ΔE / MTF
# 每次改動填 tuning log(回顧 14.7 範本)
# 版本管理:每個參數檔用 git 管,附場景照

專案輸出:版本化的參數檔 + 每階段的量化驗證 + 完整 tuning log。可重現 = 換板子 / 換人做也能得到相同結果。

14.18 量測/驗證 SOP:調校工作流驗證

  1. 順序:黑位 → LSC → AWB/CCM → 曝光基準 → NR → Sharpen → 回歸。
  2. 每次一參數:一次只改一個參數,統一場景比較。
  3. 量化指標:SNR、ΔE、MTF、動態範圍(EV 差)。
  4. 回歸:室內 / 日光 / 逆光 / 低光全跑。
  5. HDR 決策:量 EV 需求,≤ 3 EV 用 tone mapping,> 3 EV 才考慮多幀 HDR。
  6. 記錄:tuning log(日期 / 場景 / 改動 / 原因 / 結果 / 回歸 / 附圖)。
驗收指標:每階段有量化證據、回歸全過、log 完整可重現。

14.19 平台間對照:調校工作流

面向Orin NanoRPi5Orange PiThor
調校工具NVIDIA ISP Tuning Toollibcamera tuning file手動 registerNVIDIA + Holoscan
參數格式.bin / GUIJSON(可文字編輯)register 表.bin
HDR✅ 多幀 + tone⚠️✅✅ + AI
Sharpen✅ 內建⚠️
工作流順序BLC → LSC → AWB/CCM → … → 回歸,全平台相同
重點:調校「順序」是平台無關的;差異在工具與參數格式。真正可攜的資產是流程與量化方法,不是參數值。

14.20 互動式檢核清單:調校工作流驗收

14.15 Register 位元級完整工作流:HDR 3-Frame 合成驗證

步驟Command驗證目標預期結果
1. 短曝出圖argus --exposure-value 0.002高光保留高光區域有細節
2. 中曝出圖argus --exposure-value 0.016中間調正常曝光
3. 長曝出圖argus --exposure-value 0.128暗部提升暗部有細節
4. 合成Python fusionHDR 結果全範圍有細節
5. 動態範圍log2(max/min)DR 值> 60 dB
HDR 合成完整驗證腳本
#!/usr/bin/env python3
# hdr_verify.py — HDR 3-frame 合成驗證
import numpy as np, matplotlib.pyplot as plt

# 載入三幀(假設已拍攝)
short = np.fromfile("hdr_short.raw", dtype=np.uint16).reshape(800, 1280).astype(float)
medium = np.fromfile("hdr_medium.raw", dtype=np.uint16).reshape(800, 1280).astype(float)
long = np.fromfile("hdr_long.raw", dtype=np.uint16).reshape(800, 1280).astype(float)

# 曝光比
ratio_ml = 0.128 / 0.016  # medium → long = 8x
ratio_sm = 0.016 / 0.002  # short → medium = 8x

# 簡單合成:取每幀最不飽和的區域
max_val = 1023
saturation = 0.9 * max_val

# 暗部用長曝、中間調用中曝、高光用短曝
hdr = np.zeros_like(medium)
dark_mask = medium < saturation * 0.3
bright_mask = short > saturation * 0.1
mid_mask = ~dark_mask & ~bright_mask

hdr[dark_mask] = long[dark_mask] / ratio_ml
hdr[mid_mask] = medium[mid_mask]
hdr[bright_mask] = short[bright_mask] * ratio_sm

# 量測動態範圍
dr_linear = np.log2(hdr.max() / hdr[hdr > 0].min())
dr_db = 20 * np.log10(hdr.max() / hdr[hdr > 0].min())
print(f"HDR max: {hdr.max():.1f}")
print(f"HDR min: {hdr[hdr > 0].min():.1f}")
print(f"Dynamic Range: {dr_linear:.1f} stops ({dr_db:.1f} dB)")

# 比較三幀 vs HDR
fig, axes = plt.subplots(1, 4, figsize=(16, 4))
for ax, img, title in zip(axes, [short, medium, long, hdr],
                          ['Short (2ms)', 'Medium (16ms)', 'Long (128ms)', 'HDR Composite']):
    ax.imshow(img, cmap='gray', vmin=0, vmax=1023)
    ax.set_title(title); ax.axis('off')
plt.tight_layout(); plt.savefig('hdr_comparison.png')
print("Saved: hdr_comparison.png")

# Verdict
print(f"\nVERDICT: {'PASS (DR > 60dB)' if dr_db > 60 else 'CHECK: DR < 60dB'}")

14.16 多層疑難排解決策樹

決策樹 A:清晰度不足(MTF 低)
1. MTF50 < 標準的 70%?
   ├─ 是 ┐
   │   2. 鏡頭解像力不足?
   │      ├─ 換鏡頭測試 → 改善 = 鏡頭問題
   │      └─ 不改善 = 感測器 / ISP 問題
   │         → 提升 ISP 銳利化參數
   │         → 或調校 demosaic 過濾器
   └─ 否 → 清晰度合格
決策樹 B:HDR 合成有重影
1. HDR 合成後物體邊緣有殘影?
   ├─ 是 → 幀間有運動 → 需要 motion-aligned HDR
   │       或提高合成速度(用硬件加速)
   └─ 否 → 靜態場景,簡單合成即可

14.17 量測驗證完整 SOP

  1. MTF 量測:ISO 12233 解析度板 → 計算 MTF50 → 與標稱比對。
  2. 清晰度參數:記錄 ISP 銳利化參數(strength/threshold/radius)。
  3. HDR 三幀:短曝(0.002s)+ 中曝(0.016s)+ 長曝(0.128s)。
  4. 合成:Python 合成 → 計算動態範圍(log2 max/min)。
  5. DR 判定:> 60 dB = 優良;48-60 dB = 可接受;< 48 dB = 不足。
  6. 調校工作流:曝光 → AWB → LSC → 降噪 → 銳利化 → HDR(依序調整)。
  7. 前後比較:每步驟後拍照 → 細節 + 色彩 + 雜訊全面比較。
判讀標準:MTF50 > 標稱 70% ✓、DR > 60 dB ✓、調校工作流各步驟效果可見 ✓。

14.18 四平台终极對照

面向Orin NanoRPi5Orange PiThor推薦
MTF 量測ISO 12233 全平台共用平台無關
HDR 方式多幀合成 / DOL-HDRHDR 模式有限多幀 + AI 融合各有方案
動態範圍~60 dB~50 dB~40 dB>70 dB高 DR → Thor
調校工作流tegracam pipelinelibcamera tuning基本參數tegracam + Holoscan各有慣例
清晰度控制ISP 銳利化 + NRlibcamera sharp有限ISP + AI 超解析度高清晰 → Thor
HDR 重影處理motion detection有限AI motion align動態 → Thor
調校參數量數百數十數個數百 + AI各有複雜度

14.19 完整 Bring-up 專案 Checklist