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

tuning 檔解析、完整流程

14.1 清晰度與對比

14.2 動態範圍與 HDR

工程判斷:逆光場景「亮部爆掉 vs 暗部死黑」二選一時,靠 tone mapping 曲線權衡——沒有免費午餐,只能選「哪邊細節更重要」。

14.3 libcamera tuning 檔完整解析

關鍵 algorithm 區塊
{ "version": 1,
  "algorithms": [
    { "Awb":        { "mode": "auto" } },
    { "BlackLevel": { "r": 4096, "gr": 4096, "gb": 4096, "b": 4096 } },
    { "ColourMatrix": { "ccm": [ ... ] } },
    { "Denoise":   { "strength": 0.3 } },
    { "LensShading": { "meshes": [ ... ] } },
    { "Contrast":  { "strength": 1.0 } }
  ] }
區塊作用對應單元
Awb白平衡演算法設定11
BlackLevel黑位 offset(分通道)7
ColourMatrixCCM11
Denoise降噪13
LensShadingLSC 網格12
Contrast對比/gamma14

改檔後重啟程式生效。修改前備份原檔;改壞可還原。

14.4 完整調校工作流(照做)

  1. 準備:灰卡、色卡、均勻光源、固定曝光。記錄測試條件。
  2. 校正順序:黑位 → LSC → AWB/CCM → 曝光基準。
  3. 動態:AE/AWB convergence 與範圍、banding。
  4. 美化:NR ↔ Sharpen 平衡、色彩喜好。
  5. 回歸:室內/日光/逆光各拍一輪,確認沒改壞其他場景。
核心紀律:一次只改一個參數、記錄前後、統一場景比較。調校最忌「一次改一堆」→ 無法歸因。

14.5 回歸測試清單(工程級)

場景驗證項目
室內白熾/日光燈色彩、banding、AE 收斂
室外日光過曝控制、白平衡
逆光tone mapping、測光
低光雜訊、增益上限、AE

14.6 RPi5 HDR 模式詳解

RPi5 的 HDR 是多幀合成:快速連續拍不同曝光(如短/中/長),合成高動態範圍。

項目說明
啟用dtoverlay=...hdr 或 libcamera HDR 模式
缺點移動景物會 ghosting;幀率下降
適用靜態/慢速場景的高動態需求
工程取捨:HDR ≠ 萬能。運動場景用單幀 + tone mapping;靜態高動態才用多幀 HDR。先量測場景的動態範圍需求(亮部/暗部是否同時爆掉),再決定。

14.7 每次改動的記錄範本

tuning 改動 log
日期: 2026-08-16
場景: 室內日光燈 4000K
改動: Denoise strength 0.3 → 0.5
原因: 低光平坦區雜訊過明顯
結果: 平坦區 σ 下降 20%;細節區對比仍可接受
回歸: 日光場景未見明顯副作用 ✓
附圖: tuning_20260816_v3.jpg
紀律:可重現的調校 = 完整的 log。半年後你才能回答「這參數為什麼是 0.5」。

14.8 深入:Sharpen 與 NR 的互動

兩者是「翹翹板」:NR 抹掉細節 → Sharpen 拉回邊緣 → 但 Sharpen 同時放大 NR 殘留的雜訊。正確順序:

  1. 先定 NR(壓雜訊到可接受)。
  2. 再調 Sharpen(只補邊緣)。
  3. 反覆微調兩者,每次對比「平坦區」與「紋理區」。
塑膠感:NR 過強 + Sharpen 過強 = 平坦區死平、邊緣過銳(halo)。用 200% 放大檢視。

14.9 Worked Example:tuning 檔的版本管理

推薦習慣
tuning/             # 放進 git
  base.json          # 原始
  v1-black.json      # 黑位校正後
  v2-lsc.json        # LSC 後
  v3-awb-ccm.json    # 色彩後
  v4-final.json      # NR/Sharpen 後

每個版本對應一次驗收,出問題可以二分法回退。

14.10 練習

  1. 建立你的 tuning 版本管理資料夾。
  2. 完成一次「黑位→LSC→色彩→NR」的完整流程並各留一個版本。
看完這單元你應該能說出:
  • Sharpen/Contrast 與成對原則。
  • RPi5 HDR 與 tone mapping 取捨。
  • tuning 檔各 algorithm 區塊。
  • 五步調校工作流。
  • 回歸測試清單。

進階真實情境 Worked Example:用 Python 從 tuning JSON 畫出 NR vs Sharpen 的效果曲線

場景:你要量化「NR strength 從 0 到 1 時,平坦區 σ 和紋理區對比的變化」,找出最佳平衡點。

NR/Sharpen 量化比較
#!/bin/bash
# 用不同 NR strength 拍攝同一場景
for NR in 0 0.2 0.4 0.6 0.8 1.0; do
  # 建立臨時 tuning 檔(修改 Denoise strength)
  cp base.json tuning_nr${NR}.json
  python3 -c "
import json
with open('tuning_nr${NR}.json','r') as f: d=json.load(f)
for a in d['algorithms']:
    if 'Denoise' in a: a['Denoise']['strength']=$NR
with open('tuning_nr${NR}.json','w') as f: json.dump(d,f,indent=2)
"
  rpicam-still --raw --tuning-file tuning_nr${NR}.json \
    --shutter 20000 --gain 4 --awb off --awbgains 1,1 \
    -o nr_test_${NR}.jpg
done

echo "拍攝完成,用 Python 分析各張圖的 σ 和邊緣對比"
為什麼選這條路徑:透過動態生成不同 NR strength 的 tuning 檔,可以精確控制單一變數。用 rawpy 分析 RAW(而非 JPEG),能排除 JPEG 壓縮的干擾。量化方法:用 numpy 計算平坦區(如天空)的 σ 代表雜訊;用 Laplacian 運算子計算紋理區(如樹葉)的邊緣響應代表清晰度。畫出兩條曲線的交點就是最佳平衡。

深入原理擴充:RPi5 HDR 的多幀合成與 motion compensation

RPi5 的 HDR 模式是「多幀合成」——快速連續拍攝不同曝光的幀,再合成高動態範圍影像:

大家以為沒问题但其實是陷阱:很多人以為「HDR 模式會自動選擇最佳曝光組合」,但 RPi5 的 HDR 實際上曝光組合是固定的(短/中/長各佔 1/3 時間)。若場景的動態範圍主要在暗部(如夜景),短曝光幀可能「太暗而無用」——此時用單幀 + 手動 tone mapping 可能效果更好。

診斷式疑難排解表

症狀可能原因解決方案
NR 開到 1.0 畫面仍有很多雜訊增益太高(雜訊源頭過強),NR 無法完全消除降增益是根本;NR 只能收尾。接受「增益上限」的物理限制
Sharpen 開強後邊緣出現光暈(halo)Sharpen 過度——邊緣過衝降低 Sharpen 強度;用 200% 放大檢視邊緣品質
HDR 模式下運動物體有重影多幀合成的 motion compensation 不足切回單幀模式;或降低 HDR 強度(減少幀數)
tuning JSON 改了但畫面沒變化JSON 格式錯誤或 libcamera 未重啟用 python3 -m json.tool 驗證語法;重啟 rpicam-hello
暗部有色彩斷層(color banding)Gamma 曲線的暗部階梯太粗,或 CCM 的色階過飽和調整 Contrast/Gamma 區塊;降低 CCM 的副對角元素

進階挑戰題

  1. 用 Python 建立一個「NR/Sharpen 效果評分器」:輸入兩張圖(NR=0 和 NR=X),自動計算平坦區 σ 降低比例和紋理區 Laplacian 降低比例,輸出綜合評分。
  2. 分析 libcamera tuning JSON 中所有 algorithm 區塊的完整結構,畫出「參數 → 效果」對照圖。
  3. 設計一個「回歸測試自動化」腳本:依序在室內/日光/逆光/低光四個場景各拍一張,與基線圖比較 ΔE 和 σ,自動判斷是否有回歸。

延伸閱讀

專案級端到端 Worked Example:tuning 版本管理與回歸自動化專案

場景:你開始正式調校產品,需要一套「可回退、可歸因、可驗收」的 tuning 管理系統。本專案整合單元 14(工作流/回歸)、5(標準拍攝)、8(RAW 報告)、11/12/13(各區塊驗收)知識。

tuning workflow:git + 回歸腳本
# 1. tuning 納入 git,每階段一個版本
mkdir -p tuning
cp /usr/share/libcamera/ipa/rpi/pisp/ov5647.json tuning/base.json
git init tuning 2>/dev/null; cd tuning
git add base.json && git commit -m "base: 出廠預設"

# 2. 每階段修改後 commit(可二分回退)
# v1 黑位 → v2 LSC → v3 AWB/CCM → v4 NR/Sharpen

# 3. 回歸腳本:四場景各拍一張,與基準比對
#!/bin/bash
for SCENE in indoor daylight backlight lowlight; do
  rpicam-still --raw --tuning-file tuning/v4_final.json \
    --shutter 20000 --gain 1 -o reg_${SCENE}.dng
done
# → 每張跑 raw_report.py + ΔE + 暗角比 + σ,與基準比較
# → 任一指標劣化超過閾值 = 回歸,git 回退到上一版
回歸判斷
# 輸出範例
場景        ΔE  暗角比  σ      狀態
indoor     2.1  0.93   1.8    PASS
daylight   2.4  0.94   1.6    PASS
backlight  3.0  0.92   2.1    WARN (ΔE>2.5)
lowlight   2.8  0.90   3.5    FAIL (σ>3.0)
# → 檢視 lowlight 是否可接受;不可 → 調整 NR 並 commit v5
專案規模與跨單元整合:這套系統讓「調校」成為可審計的工程:git 版本讓每個參數變更可歸因(單元 14.7/14.9)、回歸腳本把單元 14.5 的清單自動化、每個指標對應一個單元的驗收方法(ΔE=11、暗角比=12、σ=13、RAW 報告=8)。一次只改一參數 + 跑回歸,是調校紀律的落地。

量測/驗證 SOP:調校回歸測試

  1. 建立基準組:校正前的標準場景 RAW + 指標。
  2. 每次改動後,用同一管線重拍四場景(室內/日光/逆光/低光)。
  3. 逐場景計算 ΔE、暗角比、σ、RAW 健康報告。
  4. 與基準比較:任何指標劣化超閾值 = 回歸。
  5. git commit 每次改動,寫明日期/場景/原因/結果。
  6. 回歸通過才可釋出該 tuning 版本。
判讀指標:閾值建議:ΔE 平均 <3、暗角比 >0.9、低光 σ 增幅 <20%;任何「看起來變差」都要量化確認,避免主觀判斷。

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

面向RPi5Orange PiOrin NanoThor
tuning 格式JSON(可讀可改)—(無標準)私有(工具編輯)私有(Holoscan)
版本管理git 直接管 JSON工具匯出/匯入工具管理
回歸自動化自寫腳本(全開源)DIYNVIDIA 內建驗證Holoscan pipeline
無內建驗證工具無工具鏈黑箱、綁 NVIDIA生態新

互動式檢核清單


第 3 輪深度加深

① Register 位元級完整工作流:RPi5 ISP 銳利度控制

步驟暫存器操作位元級說明
1. 讀取 sharpening 設定ISP tuning register blockdevmem2 readbit[7:4]=sharpening strength, bit[3:0]=threshold
2. 調整銳利度同上寫入新值strength=0xA → 中等銳利度
3. 設定 denoise-sharpen 平衡相鄰 registerOR bitsbit[0]=1 先 denoise 再 sharpen
4. 驗證read-back確認設定生效

② 多層疑難排解決策樹

決策樹 A:影像模糊(銳利度不足)

影像模糊
├─ 檢查 A:對焦是否正確
│  ├─ 手動對焦 → 調整 lens position
│  ├─ 自動對焦 → AF 算法收斂問題
│  └─ 固定焦距 → 繼續
├─ 檢查 B:sharpening 設定
│  ├─ 過低 → 增加 sharpening strength
│  ├─ 過高 → 出現 ringing → 降低 strength
│  └─ 適中 → 繼續
├─ 檢查 C:denoise 是否過強
│  ├─ 是 → 降低 denoise strength
│  └─ 否 → 繼續
└─ 檢查 D:解析度 / downscaling 是否造成
   ├─ 是 → 增加輸出解析度或優化 downscale 演算法
   └─ 否 → lens 品質或 sensor 限制

③ 量測驗證完整 SOP:MTF/銳利度量測

  1. 工具:ISO 12233 resolution chart + rawpy + scipy
  2. 步驟:
    a. 拍攝 ISO 12233 chart(均勻照明、三腳架)
    b. 裁切 SFR (Slanted Edge) 區域
    c. 計算 MTF curve:edge spread → line spread → Fourier → MTF
    d. 記錄 MTF10(10% contrast 對應的空間頻率)
  3. 判讀:MTF10 >0.5 LP/pixel = 優良;0.3-0.5 = 中等;<0.3 = 模糊
  4. 重複:三種 sharpening 設定各量一次,找最佳平衡
  5. 常見偏差:拍攝角度不對 → edge slant angle 偏差;照明不均 → baseline error

④ 四平台終極對照

面向RPi5Orange PiOrin NanoThor推薦
銳利度控制tuning file有限NV toolsHoloscan + AI各有方式
HDR 支援有限 (staggered)✓ 多 frame HDR✓ AI HDROrin/Thor HDR 最佳
調校工具libcamera tunning tool手動NV camera toolsHoloscan dashboardRPi5 開源最透明
整體畫質天花板中等較低最高Thor 畫質最高

⑤ 完整 Bring-up 專案 Checklist