NVIDIA NR
| 雜訊 | 來源 |
|---|---|
| shot noise | 光子隨機性 |
| read noise | 讀出電路 |
| dark current | 高溫/長曝光 |
| hot pixel | 缺陷像素 |
# 目標 SNR >= 30dB(σ/S < 3.2%) # gain 高時量測:σ=20, 訊號=400 SNR = 20*log10(400/20) = 26 dB # 不達標 # 補光 + 降增益:訊號 800, σ≈18 → SNR 33 dB ✓ # 結論:補光 + 降增益 優於 硬拉增益
python3 - <<'EOF'
import rawpy, numpy as np, subprocess
for g in [1, 2, 4, 8]:
# 用平台指令取 RAW(OV9281)
raw = rawpy.imread(f'g{g}.dng').raw_image
roi = raw[500:1500,500:1500].astype(float)
print(f'gain={g} σ={roi.std():.1f}')
EOF感測器雜訊可模型化成兩大類,理解它們才能預測「哪個參數會讓雜訊爆炸」。
| 雜訊 | 模型 | 特性 |
|---|---|---|
| Shot noise(光子雜訊) | σ = √N(N=電子數) | 與訊號正相關,無法消除 |
| Read noise(讀出雜訊) | 固定 σ_r | 低光時主導 |
| Dark current | 隨溫度/曝光時間 | 長曝光 + 高溫明顯 |
| FPN | 固定 pattern | 與場景無關的固定圖樣 |
電子數 N,read noise σ_r: 總雜訊 σ = √(N + σ_r²) SNR = 20·log10(N / σ) dB 例:N=1000, σ_r=30 σ = √(1000 + 900) ≈ 43.6 SNR = 20·log10(1000/43.6) ≈ 27 dB 若增益 ×2(等效 N 變小但 read noise 放大): 雜訊會比「同曝光直接 +50% 光」更糟
場景:低光,目標 SNR ≥ 30 dB 選項 A:gain ×4(不補光) 量測 RAW 雜訊 σ=25,訊號=200 SNR = 20·log10(200/25) = 18 dB ✗ 選項 B:補光讓訊號 ×2(gain ×1) 訊號=800(感測器飽和前),σ≈18 SNR = 20·log10(800/18) ≈ 33 dB ✓ 結論:補光 + 低增益 遠優於 硬拉增益
1. 增益拉太高? ├─ 是 → 補光 / 縮短快門 / 加曝光(unit-10) └─ 否 ─┐ 2. 長曝光造成 dark current? ├─ 是 → 降溫 / 縮短曝光 └─ 否 ─┐ 3. 固定圖樣雜訊(FPN)? ├─ 是 → 校正 / DPC └─ 否 ─┐ 4. ISP NR 沒開或太弱? └─ 是 → 調 NR(空間+時間)
降噪的輸入不是單一的「髒」數字。shot noise 隨訊號以平方根成長,read noise 在低光占比高,FPN/DPC 則具有空間固定性。空間 NR 依鄰域相似性抑制,時間 NR 依前後幀相似性抑制;兩者都可能把真實細節或快速運動當成雜訊。
| 類型 | 辨識特徵 | 優先處理 |
|---|---|---|
| shot/read noise | 隨曝光或 gain 改變 | 光量、類比 gain、NR |
| FPN | 固定條紋/固定亮暗點 | 黑位校正、校正表 |
| hot/dead pixel | 固定位置極端值 | DPC,不能靠強 NR |
同一曝光、溫度、gain 取 20 張暗場 RAW 對每個像素計算: mean = 20 張平均 # black level / FPN std = 20 張標準差 # temporal read noise 全域:mean=64.8, std=3.1 code 若某些位置 mean=140 且每張都固定 → hot pixel / FPN 若整區 std 隨 gain 從 3.1 升到 12.4 → gain 放大 read noise 決策:先修固定偏差,再用 NR 處理隨機變動。
1. 關閉/降低 NR 後雜訊是否仍在 RAW? ├─ 是 → 先查曝光、gain、溫度、黑位 └─ 否 ─┐ 2. 雜訊固定在同一像素? ├─ 是 → DPC/FPN 校正 └─ 否 ─┐ 3. 動態物體後方有拖影? ├─ 是 → 降低 temporal NR,查 motion threshold └─ 否 ─┐ 4. 邊緣有白邊/假紋理?→ 降 sharpen 或 spatial NR strength
場景:Thor T5000 搭載在戶外監控站,OV9281 24 小時不間斷運作。白天溫度 25°C、夜晚降至 5°C。目標:全天候穩定 SNR ≥ 28 dB。
# dark current 模型: # DC(T) = DC_25 × 2^((T-25)/10) # DC_25 = 10 e⁻/s(25°C 基準) # 白天 25°C: DC = 10 e⁻/s × 曝光 8.3 ms = 0.083 e⁻(可忽略) # 正午 45°C(陽光直射機殼): DC = 10 × 2^((45-25)/10) = 10 × 4 = 40 e⁻/s DC_8.3ms = 0.33 e⁻(仍可忽略) # 但若長曝光(如夜間 100 ms): DC = 40 × 0.1 = 4 e⁻(開始有影響) SNR 影響:4 e⁻ 佔 full well 10000 的 0.04%(微小但累積) # 真正問題:溫度漂移造成的 black level 變化 # 25°C → 45°C:black level 從 64 漂移到 68(+4 code) # → OB 校正若不跟隨溫度 → 後續 AWB/LSC 偏移 # 解決方案: # 1. 加入溫度感測器(感測器內建或外掛) # 2. 每 10 分鐘重新量測 black level # 3. 動態更新 OB 校正值
temporal NR 依前後幀的差異判斷「哪些是雜訊、哪些是運動」。差異小於閾值 → 認為雜訊並平均壓制;差異大於閾值 → 認為運動並保留。閾值設定太高會讓雜訊通過;太低會讓運動物體留下殘影。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 夜間畫面雜訊明顯增加但白天正常 | 低光下 gain 提高,read noise 被放大 | 用 SNR 預算量化:計算夜間的 gain 上限,超過則補光 |
| DPC 開啟後仍有固定亮點 | DPC threshold 設定過低,未偵測到該缺陷 | 提高 DPC threshold;或用手動缺陷像素表補充 |
| temporal NR 在動態場景產生殘影 | NR temporal 閾值過低,慢速運動被壓制 | 提高 temporal NR threshold;或根據場景運動速度動態調整 |
| 空間 NR 開太強導致邊緣模糊 | spatial NR 強度過高,把邊緣當雜訊 | 降低 spatial NR strength;確保 sharpen 在 NR 之後 |
| 長時間運作後 black level 漂移導致色彩偏移 | 溫度變化造成 dark current 變化 | 加入溫度感測器,動態更新 OB 校正值 |
場景:低光倉庫機器人,目標全天候 SNR ≥ 28 dB。專案目標:量化各 gain 下雜訊,找出增益上限,決定補光與降噪策略。
M1 暗場量測 ├─ 固定條件取 20 張暗場 ├─ 算 mean(black level)與 std(read noise) └─ 通過:black level 固定、std 合理 M2 σ vs gain ├─ gain 1/2/4/8 各量 σ └─ 通過:畫出 σ-gain 曲線,找出暴增區間 M3 SNR 預算 ├─ 各場景算 SNR(unit-13.9) └─ 通過:知道哪些場景不達標 M4 增益上限 ├─ 設 max gain(σ 暴增前) └─ 通過:AE 不超過上限 M5 降噪策略 ├─ DPC(缺陷表)→ 空間 NR → 時間 NR ├─ 黑框 RAW 驗證 DPC 壓制 max └─ 通過:NR 後 SNR 達標且細節保留 M6 回歸 + 交付 └─ 通過:SNR 預算表 + 增益上限 + NR 參數進 repo 驗證: SNR = 20·log10(signal / σ) 黑框 max 值 = DPC 效能指標
Step 1 暗場收集 固定曝光/gain/溫度,取 20 張暗場 RAW Step 2 統計 mean=black level、std=read noise Step 3 增益掃描 gain 1/2/4/8 各量 σ,畫曲線 Step 4 SNR 預算 各場景算 SNR,比對目標 Step 5 DPC 驗證 黑框 RAW 的 max 值應被壓制 Step 6 NR 調整 空間 NR(細節)vs 時間 NR(殘影)取捨 判讀指標: σ 隨 gain 暴增 → 找出上限 固定亮點 → hot pixel / FPN(DPC 處理) 殘影 → temporal NR 閾值太低 邊緣模糊 → spatial NR 太強
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| NR 引擎 | NVIDIA 空間+時間 | libcamera(可調) | 感測器內建(有限) | NVIDIA 空間+時間 |
| DPC | ✅ | ✅ | ⚠️ | ✅ |
| NR 強度控制 | 受限(自動化) | ✅ 全可調 | 低 | 受限 |
| 時間 NR 殘影控制 | ✅ 內部 | ✅ 可調 threshold | ⚠️ | ✅ 內部 |
| 高增益行為 | 自動調適 | 需手動調 | 固定 | 自動調適 |
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
NR_SPATIAL_CTRL | 0x00140400 | Spatial noise reduction 控制 | bit[0]=enable, bit[5:3]=strength, bit[7:6]=mode |
NR_TEMPORAL_CTRL | 0x00140404 | Temporal noise reduction 控制 | bit[0]=enable, bit[4:1]=temporal strength, bit[5]=motion adaptive |
# Step 1: 讀取目前值 $ devmem2 0x00140400 w # 記錄 current_value # Step 2: 計算新值(設定 bit[0]=1) $ new_value=$((current_value | 0x0001)) # Step 3: 寫入 $ devmem2 0x00140400 w $new_value # Step 4: 驗證 $ devmem2 0x00140400 w # 確認 bit[0] = 1,其餘 bit 不變 # Step 5: 進階 — bitmask 操作 $ read_val=$(devmem2 0x00140400 w | grep "Read" | awk '{print $NF}') $ mask=0x0001 $ expected=0x0001 $ [ $(($read_val & $mask)) -eq $expected ] && echo "PASS" || echo "FAIL: bit[0] not set"
1. 細節消失、油畫感? ├─ Spatial NR strength 太高 → 降低 bit[5:3] 值 └─ Temporal NR + 快速移動 → 開啟 motion adaptive (bit[5]) 2. 紋理被抹除? └─ NR threshold 太低 → 提高 threshold 保留紋理
1. 暗場雜訊明顯? ├─ NR 未啟用 → 確認 NR_SPATIAL_CTRL bit[0] = 1 └─ 強度不夠 → 逐步提高 strength(注意 trade-off) 2. 雖有 NR 但色噪(chroma noise)仍在? └─ Chroma NR 獨立控制 → 確認 chroma denoise 開啟
降噪效果完整量測 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 拍攝暗場 | 蓋鏡頭 + 感測器,ISO=gain_max | 無光環境 |
| Step 2 | NR OFF 基準 | 關閉所有 NR,取 10 幀平均 | 得到 pure noise pattern |
| Step 3 | 量測 noise level | ROI 標準差(Spatial domain) | 記錄 DN RMS |
| Step 4 | 啟用 Spatial NR | NR_SPATIAL_CTRL bit[0]=1 | noise 減少 30–50% |
| Step 5 | 啟用 Temporal NR | NR_TEMPORAL_CTRL bit[0]=1 | noise 再減 50% |
| Step 6 | 量測 SNR | SNR = 20×log10(signal/noise) | 期望 > 36 dB |
| Step 7 | 細節保留 | 拍攝 resolution chart,NR ON/OFF 比較 | MTF 下降 < 10% |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| NR 類型 | Spatial + Temporal + ML | Spatial only(硬體) | 軟體 NR(無硬體) | Spatial + Temporal |
| NR 強度等級 | 0–255(可調) | Limited (low/med/high) | N/A | 0–15(4-bit) |
| Temporal NR | ✅ | ❌ | ❌ | ✅ |
| ML 降噪 | ✅ | ❌ | ❌ | ❌ |
| NR 效能影響 | ~5% ISP overhead | ~10% GPU if software | CPU only | ~5% ISP |
| NR 校準工具 | NR Visualizer(強度 preview) | `raspistill --denoise` | OpenCV bilateral | ISP tuning tool |
針對「雜訊與降噪」主題的完整 bring-up 步驟清單: