單元 13 · 雜訊與降噪

後處理 NR

雜訊來源

雜訊來源
shot noise光子隨機性
read noise讀出電路
dark current高溫/長曝光
hot pixel缺陷像素

OV5640 DPC

OV5640 內建缺陷像素校正(DPC),先修 hot pixel——在降噪前處理效果最好。

降噪策略(Orange Pi 無平台 NR 時)

  1. 感測器端增益別拉太高(源頭)。
  2. 後處理:時間域平均(多幀)或空間降噪(OpenCV fastNlMeansDenoising)。
  3. 或升級到有 ISP 的板卡。
鐵律:降噪與細節是取捨——NR 太強畫面變「塑膠感」。

13.6 雜訊預算(Worked Example)

判斷「補光還是接受雜訊」
# 目標 SNR >= 30dB(σ/S < 3.2%)
# gain 高時量測:σ=20, 訊號=400
SNR = 20*log10(400/20) = 26 dB   # 不達標
# 補光 + 降增益:訊號 800, σ≈18 → SNR 33 dB ✓
# 結論:補光 + 降增益 優於 硬拉增益
工程判斷:用 SNR 預算量化,先定可接受的 SNR,再決定曝光/增益/補光組合。

13.7 DPC 與 NR 順序

13.8 深入:雜訊量測與增益上限

量 σ vs gain
python3 - <<'EOF'
import rawpy, numpy as np, subprocess
for g in [1, 2, 4, 8]:
    # 用平台指令取 RAW(OV5640)
    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
判讀:σ 暴增的增益區間 = 不可接受 → 設定增益上限,改用曝光補。

13.9 深入原理:雜訊模型與 SNR 數學

雜訊不是「隨機骯髒」——它可被數學模型預測,這是雜訊預算的基礎:

雜訊項模型特性
Shot noiseσ_shot ∝ √(S)光子隨機性,與訊號綁定
Read noiseσ_read ≈ 常數讀出電路,低光主導
Dark currentσ_dark ∝ t × T長曝光/高溫上升
Fixed pattern常數 offset固定圖樣,黑位校正移除

SNR 公式:SNR = 20·log₁₀(S / σ_total)。增益放大「訊號與雜訊一起」——所以「拉增益」不會改善 SNR,只會讓影像看起來更亮、雜訊也更明顯。要提升 SNR,只能:增加光子(補光/加長曝光)或降低 read noise。

設計意涵:低光場景的黃金順序 = 加長曝光(若無 motion blur 風險)→ 補光 → 最後才拉增益。這就是單元 10 鐵則的數學依據。

13.10 完整 Worked Example:量測 σ 並設定增益上限

步驟 1|關 AGC、鎖定曝光、逐級設增益
v4l2-ctl -d /dev/v4l-subdev0 -c auto_exposure=0 -c auto_gain=0
for g in 64 128 256 512 1024; do
  v4l2-ctl -d /dev/v4l-subdev0 -c gain=$g
  v4l2-ctl -d /dev/video0 --stream-mmap=3 --stream-count=1 --stream-to=g$g.raw
done
步驟 2|統計暗部 ROI 的 σ
python3 - <<'EOF'
import numpy as np
for g in [64,128,256,512,1024]:
    raw = np.fromfile(f'g{g}.raw', dtype=np.uint16).reshape(720,1280)
    roi = raw[500:1500,500:1500].astype(float)
    print(f'gain={g:5d}  σ={roi.std():6.1f}  mean={roi.mean():6.1f}')
EOF
步驟 3|算每檔 SNR 並找上限
# 對暗部:SNR = 20*log10(mean/σ)
python3 - <<'EOF'
import numpy as np
for g in [64,128,256,512,1024]:
    raw = np.fromfile(f'g{g}.raw', dtype=np.uint16).reshape(720,1280)
    roi = raw[500:1500,500:1500].astype(float)
    snr = 20*np.log10(roi.mean()/max(roi.std(),1e-6))
    print(f'gain={g:5d}  SNR={snr:5.1f} dB')
EOF
完成標準:畫出「增益 vs SNR」曲線,找出 SNR 掉到目標(如 30dB)以下的增益檔位,把「該檔以上」訂為增益上限並寫進調校文件。

13.11 疑難排解決策樹:雜訊問題

現象方向
整片顆粒感增益太高 → 降增益、加曝光/補光
固定亮點(hot pixel)缺陷像素 → DPC 先做
長曝光才出現亮點dark current → 縮短曝光或降溫
條紋狀雜訊read noise / 電源干擾 → 查電源、時序
NR 後糊掉NR 過強 → 取捨細節
常見錯誤與陷阱:① 在過曝區量 σ——飽和區 σ 失真;② 用 JPEG 量雜訊——壓縮掩蓋真實 σ;③ 忽略 DPC,先上 NR——缺陷像素被 NR 擴散成亮斑;④ 追求「零雜訊」把 NR 開滿——畫面變塑膠。工程目標是「可接受 SNR」,不是零雜訊。

13.12 練習

  1. 完成 σ 量測與 SNR 計算,輸出「增益 vs SNR」表。
  2. 訂出你場景的增益上限並寫進 SOP。
  3. 比較 DPC 前/後、NR 前/後的影像,記錄取捨。
  4. 說明「拉增益為何不改善 SNR」,用公式推導。

13.13 回顧練習

  1. 量測各增益 σ。
  2. 決定增益上限並記錄。

13.14 進階真實情境 Worked Example:RK3588 ISP3 NR vs OpenCV NR 的效能比較

場景:Orange Pi 5 Plus(RK3588)接 OV5640,在低光場景下比較 ISP3 硬體 NR 與 OpenCV 後處理 NR 的效果與延遲。

步驟 1|ISP3 硬體 NR
# 啟用 ISP3 的 Bayer denoise 模組
media-ctl -d /dev/media0 -V "'rkisp-isp':0[nr_strength=128]"
v4l2-ctl -d /dev/video0 --stream-mmap=3 --stream-count=1 --stream-to=isp_nr.yuv
步驟 2|OpenCV 後處理 NR
python3 - <<'EOF'
import cv2, time
img = cv2.imread('noisy.png')
t0 = time.time()
nr = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
dt = time.time() - t0
print(f'OpenCV NR: {dt*1000:.0f}ms for {img.shape[1]}x{img.shape[0]}')
cv2.imwrite('opencv_nr.png', nr)
EOF
設計決策:ISP3 NR 是硬體管線內的即時處理(延遲 <1 frame),但 tuning 參數封閉;OpenCV NR 可精細控制但延遲高(數百 ms)。選擇取決於「即時性需求 vs 降噪品質」。

13.15 深入原理擴充:OV5640 DPC vs RK3588 ISP3 DPCC

項目OV5640 DPCRK3588 ISP3 DPCC
校正方式固定 threshold自適應(根據統計動態調)
支援像素類型hot pixel(亮)hot + cold pixel(亮+暗)
校正強度有限(register 公開少)可調(tuning 工具)
副作用過強會抹掉細節過強同樣會模糊

容易忽略的邊界案例:OV5640 的 DPC 與 ISP 的 NR 是獨立模組,但它們的順序很重要——DPC 必須在 NR 之前做,否則 NR 會把 hot pixel 擴散成亮斑。在 RK3588 上,ISP3 的 DPCC 與 Bayer denoise 也在管線中有固定順序(DPCC → Denoise),但如果你用後處理,必須手動確保這個順序。

13.16 診斷式疑難排解表

症狀可能原因解決方案
低光場景 SNR 低但拉增益無效增益同時放大訊號與雜訊補光 + 降增益;或加長曝光(若無 motion blur)
hot pixel 在 NR 後變成亮斑DPC 沒先做,NR 擴散了缺陷像素先 DPC(修 hot pixel)再 NR
長曝光暗部有固定亮點dark current 累積縮短曝光或降溫(若可能)
NR 後畫面「塑膠感」NR 強度過高降低 NR 強度;接受適度雜訊換回細節
ISP3 NR 效果不如預期NR tuning 參數未調整用 Rockchip tuning 工具調整 Bayer denoise 參數

13.17 進階挑戰題

  1. 在 RK3588 上,分別用 ISP3 硬體 NR 與 OpenCV NR 處理同一低光 RAW,比較 PSNR 與處理延遲。寫出「什麼場景該用哪個」的決策建議。
  2. 實作「增益上限自動偵測」腳本:逐級增益取幀,統計暗部 σ,找出 SNR 掉到 30dB 以下的增益值,自動寫入調校文件。
  3. 比較 OV5640 DPC 在「開/關」狀態下,NR 前後的 hot pixel 數量變化,量化 DPC 的重要性。

13.18 專案級 Worked Example:雜訊預算與降噪策略專案

把單元 13 的雜訊知識做成完整雜訊管理專案:建立「場景照度 → 增益上限 → SNR → 降噪策略」的決策鏈。這是低光產品(監控、門鈴、車載)畫質控制的基礎。

階段 1|量各增益的 SNR 曲線(單元 13.10)
v4l2-ctl -d /dev/v4l-subdev0 -c auto_exposure=0 -c auto_gain=0
for g in 64 128 256 512 1024; do
  v4l2-ctl -d /dev/v4l-subdev0 -c gain=$g
  v4l2-ctl -d /dev/video0 --stream-mmap=3 --stream-count=1 --stream-to=g$g.raw
done
階段 2|算 SNR 並訂增益上限
python3 - <<'EOF'
import numpy as np
for g in [64,128,256,512,1024]:
    raw = np.fromfile(f'g{g}.raw', dtype=np.uint16).reshape(720,1280)
    roi = raw[300:420,500:780].astype(float)
    snr = 20*np.log10(roi.mean()/max(roi.std(),1e-6))
    flag = 'OK' if snr>=30 else '超上限'
    print(f'gain={g:5d}  SNR={snr:5.1f} dB  {flag}')
EOF
階段 3|定降噪策略
# 依 SNR 分級:
#   SNR ≥ 40 dB → 不需 NR(保留細節)
#   30–40 dB   → 輕度時域平均(2 幀)
#   < 30 dB    → 空間 NR + 補光建議
python3 - <<'EOF'
# 時域平均(多幀降噪)範例:
import numpy as np
frames = [np.fromfile(f'seq_{i}.raw', dtype=np.uint16).reshape(720,1280)
          for i in range(1,5)]
avg = np.mean(frames, axis=0).astype(np.uint16)
avg.tofile('seq_avg.raw')
print('4 幀時域平均完成(SNR 約提升 6 dB)')
EOF
階段 4|產出雜訊管理文件
# 輸出範例:
# 場景照度     建議曝光   增益上限   SNR    降噪策略
# 日間(>500lx)  2000     128       ≥45   無
# 黃昏(50lx)   8000     256       35     時域平均 x2
# 夜間(5lx)    20000    512       28     空間 NR + 補光
專案完成標準:你有一份「雜訊管理表」:每個場景照度等級的曝光/增益/降噪建議。產品設計時依表調度,畫質在「可接受 SNR」與「細節保留」之間取得一致平衡。

13.19 量測/驗證 SOP:雜訊與 SNR 驗收

步驟作法通過判據
1. 鎖定條件關 AEC/AGC,固定曝光條件穩定可控
2. 逐級增益取樣每級取 RAW每級皆有效資料
3. 量 ROI σ避開飽和與黑位區σ 合理(無飽和失真)
4. 算 SNR20·log10(mean/σ)記錄每級 SNR
5. 訂上限SNR 掉到目標值以下訂出增益上限
6. 驗證 DPC 順序黑框 RAW 的 maxDPC 後亮點被壓制
SOP 紀律:量 σ 絕不能在飽和區(σ 失真)或 JPEG(壓縮污染)。永遠用 RAW、避開飽和、固定 ROI——這是雜訊量測的三個鐵律。

13.20 平台間對照:雜訊與降噪

面向Orange PiRPi5Orin NanoThor
硬體 NRRK3588 有 / H618 無ISP 內建 NRNVIDIA ISP NRNVIDIA ISP NR
DPC感測器 DPCISP + libcameraNVIDIA DPCCNVIDIA DPCC
後處理 NROpenCV fastNlMeanslibcamera 後期可選Holoscan 元件
時域平均自寫 Pythonlibcamera 支援可選可選
NR 控制參數開放(可調)開源可改封閉封閉
核心領悟:雜訊物理(shot/read/dark)四平台相同,SNR 預算方法通用。Orange Pi 的優勢是「能親手實作時域/空間降噪」——理解原理後,任何平台的 NR 參數都看得懂。

13.21 互動式檢核清單:本單元進階驗收

checklist
- [ ] 我能完成雜訊管理專案並產出「雜訊管理表」。
- [ ] 我能量測各增益的 SNR 並訂出增益上限。
- [ ] 我理解「拉增益不改善 SNR」的數學原理。
- [ ] 我遵守「DPC 先、NR 後」的順序。
- [ ] 我已用時域平均驗證 SNR 提升(多幀 +6dB)。
- [ ] 我知道如何在四平台對應 NR 策略(硬體/後處理)。

13.22 Register 位元級完整工作流

雜訊管理的「讀→改→寫→驗證」是影像品質的關鍵。以下是 OV5640 的位元級操作序列:

步驟暫存器/位址位元欄位操作預期值
1. 開啟 DPC0x5080[0] DPC enablei2cset -y 3 0x3c 0x5080 0x01DPC 開啟
2. 設定 DPC 閾值0x5081[7:0] thresholdi2cset ... 0x5081 0x10依雜訊程度
3. 開啟 NR0x5300[0] NR enablei2cset ... 0x5300 0x01NR 開啟
4. 設定 NR 強度0x5301[7:0] strengthi2cset ... 0x5301 0x20依需求
5. 回讀驗證0x5080 / 0x5300[0]i2cget ... 0x5080; i2cget ... 0x5300兩者皆 = 0x01
6. 取幀對比v4l2-ctl拍兩幀(NR on/off)雜訊減少
位元級關鍵: DPC(去壞點)必須在 NR 之前做。DPC 移除孤立的壞點;NR 平滑剩餘雜訊。順序錯誤會導致壞點被 NR 放大。

13.23 多層疑難排解決策樹

決策樹 A:雜訊太重

決策樹 A
影像雜訊太重?
├─ 增益太高 → 減少 analog gain
│  └─ 測試 gain=1/2/4/8 的 SNR
├─ 暗場 → 增加曝光(拉亮場景)
│  └─ 或用時域平均(多幀堆疊)
├─ NR 強度不足 → 增加 0x5301 值
│  └─ 但注意細節會被抹掉
└─ 有壞點 → 先開 DPC
   └─ 0x5080=0x01, 0x5081 調閾值

決策樹 B:NR 抹掉細節

決策樹 B
NR 後細節模糊?
├─ NR 強度太高 → 減少 0x5301 值
├─ 改用時域平均(不傷細節)
│  └─ 多幀堆疊:SNR 提升 6dB/倍數
├─ 改用空間 NR 的低強度
│  └─ 取捨:雜訊 vs 細節
└─ 接受限制
   └─ 記錄「NR 強度 vs 細節」的取捨

13.24 量測驗證完整 SOP

步驟指令預期輸出判讀標準
1. 量測 SNRPython script(signal/noise)SNR 值(dB)依增益
2. 關閉 NRi2cset ... 0x5300 0x00無降噪基準雜訊
3. 開啟 NRi2cset ... 0x5300 0x01; i2cset ... 0x5301 0x20降噪雜訊減少
4. 量測後 SNRPython scriptSNR 值提升 > 3dB
5. 測 DPCi2cset ... 0x5080 0x01壞點移除孤立壞點消失
6. 時域平均多幀堆疊 PythonSNR 提升+6dB/倍數

13.25 四平台終極對照

面向Orange PiRPi5Orin NanoThor推薦
DPCOV5640 內建ISP 內建ISP 內建ISP 內建底層→OV5640
空間 NROV5640 內建ISP 內建NVIDIA NRNVIDIA NR學習→OV5640
後處理 NROpenCV fastNlMeanslibcamera 後期可選Holoscan底層→OpenCV
時域平均自寫 Pythonlibcamera 支援可選可選學習→Python
NR 控制參數開放開源可改封閉封閉學習→Orange Pi

13.26 完整 Bring-up 專案 Checklist

checklist
- [ ] 完成「雜訊管理專案」並產出雜訊管理表
- [ ] 量測各增益的 SNR 並訂出增益上限
- [ ] 驗證「拉增益不改善 SNR」的數學原理
- [ ] 遵守「DPC 先、NR 後」的順序
- [ ] 用時域平均驗證 SNR 提升(多幀 +6dB)
- [ ] 在四平台對應 NR 策略(硬體/後處理)
- [ ] 產出「NR tuning report」(含 SNR/增益/細節取捨)
- [ ] 測試 DPC 閾值對壞點移除的影響
- [ ] 測試 NR 強度對細節的影響
- [ ] 產出「雜訊管理表」(SNR/增益/NR/quality)
看完這單元你應該能說出:
  • 四種雜訊來源。
  • OV5640 DPC 角色。
  • Orange Pi 降噪三策略。
  • 降噪與細節取捨。

延伸閱讀