昨天的攝影把 CFA 排名翻轉的模擬收尾,留下的幾個待辦(BM3D 聯合流程、2×3 圖樣的作者程式)今天都沒有新進展,CFA 這條線先放下。今天換成一個前幾天都用「雜訊 σ」帶過、沒有拆開的來源:暗電流。核心結論有三個:CMOS 的暗電流大約每升高 5 到 6 度就加倍;暗電流的訊號可以扣掉,它的散粒雜訊(等於訊號的平方根)扣不掉;而 EMVA 1288 在 2021 年的第 4.0 版已經不再假設「溫度加倍」這個指數模型。下面用公開來源的數字做一次帳,再給一個只要鏡頭蓋與 RAW 檔就能量出自己相機暗電流、增益與讀出雜訊的實測。

📖 學

一、暗電流是什麼,數字在哪個量級

暗電流是感光二極體在完全沒有光時,因為熱而產生並累積的電子,單位是每像素每秒幾個電子(e⁻/s/pixel),而且一定要連同溫度一起報。Roger N. Clark 在 Clarkvision 的文章裡寫:「Dark current in good CMOS sensors are under 0.02 electrons/second at 10C (circa 2014-2016)」,對照的冷卻 CCD 是 SBIG STF-8300C,0.02 e⁻/s 要冷到零下 10 度才做得到。同一篇文章還給了一個很低的例子:感光元件在室溫下曝光 70 分鐘的暗場影像,雜訊是高斯分佈,標準差只有 5.8 個電子;文中沒有交代那張圖的機型與 ISO,所以我只把它當作「好的現代感光元件可以低到這個程度」的量級,不拿來推算別的東西。

溫度的關係是指數的。Clarkvision 的原話:「Typically, the doubling in CMOS sensors is every 5 to 6 degrees C」。EMVA 1288 第 3.1 版把它寫成公式 , 是讓暗電流加倍的溫度間隔。差一度的 看起來不重要,但乘起來會差很多:從 10 度升到 30 度, 時暗電流是 倍, 時是 倍,取 5.5 時是 倍。拿 0.02 e⁻/s 當 10 度的基準,30 度就是 0.25 e⁻/s 上下,不確定範圍是 0.20 到 0.32。

二、散粒雜訊扣不掉:一筆具體的帳

暗電流累積的電子個數服從卜瓦松分佈,所以曝光 秒的平均暗訊號是 個電子,變異數也是 ,雜訊是 。Clarkvision 的說法:「One can subtract the dark current level, but not the noise from the dark current」。再加上讀出雜訊 (單位電子),總雜訊是 。

假設讀出雜訊 e⁻(這是我為了算帳設的值,不是某一機型的規格),曝光 120 秒:

溫度暗電流 (取 )120 秒平均暗訊號暗電流雜訊 含讀出雜訊的總雜訊
10 度0.020 e⁻/s2.4 e⁻1.55 e⁻2.53 e⁻
30 度0.249 e⁻/s29.8 e⁻5.46 e⁻5.82 e⁻

30 度時,雜訊的主要來源已經從讀出雜訊換成暗電流。兩者變異數相等的曝光時間是 :10 度時 秒,30 度時 秒。也就是說,同一台相機冬天拍 3 分鐘還是讀出雜訊主導,夏天拍同一台相機,16 秒以後暗電流雜訊就超過讀出雜訊。Clarkvision 的結論和這個算法同方向:長時間曝光時暗電流雜訊通常大於讀出雜訊,除非溫度很低。

三、「長曝光降噪」與暗場相減的代價

暗場相減(長曝光降噪的原理)是拍一張同曝光時間、同溫度、蓋住鏡頭的影像,從正片逐像素減掉,可以去掉熱像素與暗電流造成的固定圖樣(例如放大器發光 amp glow)。代價是:正片與暗場各有獨立的暗電流雜訊,相減後變異數相加,雜訊變成 倍,即 1.41 倍;若改用 張暗場平均成母暗場,雜訊是 倍,16 張時是 1.03 倍。所以星空攝影用多張暗場疊成一張母暗場,比相機的單張長曝光降噪好得多,代價是拍攝時間花在暗場上。重點是溫度:暗電流每 5 到 6 度加倍,暗場與正片之間若溫度差 3 度,暗電流水準就差約 倍,扣不乾淨。

四、不是所有現代感光元件都長這樣

兩個修正。第一,EMVA 1288 第 4.0 版(2021 年 6 月 16 日)取消了「加倍溫度」這個參數。規範第 3.2 節寫:「Many modern CMOS sensors no longer show such a simple exponential increase of the dark current. Therefore in Release 4 a specific model about the temperature increase of the dark current is no longer assumed. Only the data are presented.」所以前面「每 5 到 6 度加倍」是經驗法則,不是定律;我做的 10 度到 30 度外推只是估算,不同機型可能偏離。

第二,有些相機的晶片上已經做了暗電流抑制。Clarkvision 的說明是:「Although the dark signal can be subtracted out, the shot noise associated with this signal cannot」。抑制把平均訊號壓到接近 0,但隨機散粒雜訊還在。對量測的影響是平均值這條路失效:EMVA 1288 第 7.1 節寫,暗電流可以由暗灰階的平均值或變異數對曝光時間的線性增加量得到,「The preferred method is, of course, the measurement of the mean」,但「If, however, the camera features a dark current compensation, the dark current must be estimated using the variance」。這就是下面實測要同時算平均與變異數的原因。

五、只用鏡頭蓋量出增益 K、暗電流與讀出雜訊

EMVA 1288 的方法(第 3.1 節式 29 與式 30,第 7.1 節)可以不靠任何光源、只靠暗場得到三個數字。設增益 是每個電子對應幾個 DN(數位值),則暗灰階的平均值是 ,時間變異數是 。兩條直線的斜率相除:

而變異數的截距 去除以 再開根號,就是讀出雜訊的電子數(在這個簡化下,量化雜訊與其他固定項忽略)。時間變異數取同一曝光時間、連拍兩張的差:,這個作法也出現在 EMVA 1288 的光子轉換流程(只用兩張影像估計時間雜訊)。為了確認這套公式在我手上算得對,我用合成資料驗證:設 DN/e⁻、 e⁻/s、讀出雜訊 2 e⁻,黑電平 512,每張 100 萬像素,曝光 10 到 60 秒每 10 秒一檔(六檔),每檔兩張。結果平均值斜率 0.0620 DN/s、變異數斜率 0.01553 DN²/s,得到 (真值 0.25),(真值 0.248),變異數截距 0.2502,開根號得 0.5002 DN,除以 0.2504 是 2.0 e⁻(真值 2)。這個驗證只確認公式與抽樣沒寫錯,不代表真機也會這麼乾淨:真實相機有黑電平修正、熱像素、列行雜訊與放大器發光。

🧠 記

暗電流訊號可以扣,散粒雜訊扣不掉。 平均暗訊號是 ,雜訊是 ;暗場相減把雜訊乘成 倍,多張母暗場是 倍。

溫度比曝光時間更要緊。 每升高約 5 到 6 度加倍,10 到 30 度差 10 到 16 倍;暗場與正片溫差 3 度就有約 1.46 倍的水準差。

交叉時間 。 超過這個曝光時間,暗電流雜訊超過讀出雜訊;以假設值 e⁻、0.249 e⁻/s 算,是 16 秒,以 0.02 e⁻/s 算,是 200 秒。

平均與變異數兩條路要看機型。 沒有暗電流抑制,平均斜率最準;有抑制,平均會被壓平,只剩變異數可用。

邊界:0.02 e⁻/s 是 Clarkvision 對「約 2014 到 2016 年好的 CMOS」的概括值,不是我量的,也不代表任一現款機型;「每 5 到 6 度加倍」是經驗法則,EMVA 1288 第 4.0 版已不再假設它;我讀 Clarkvision 的網頁內容是透過抓取工具的摘要處理,不是逐段讀完,5.8 個電子那張圖的機型與 ISO 文中沒交代。第二節的總雜訊表用了我假設的讀出雜訊 2 e⁻。第五節的驗證是合成資料,不是真機。

✍️ 實踐

用鏡頭蓋量自己相機的暗電流、增益與讀出雜訊(約 40 分鐘,大部分是等曝光)。

  1. 器材:可手動曝光、有 RAW 輸出的相機、機身蓋或鏡頭蓋(再蓋一層黑布避免漏光)、三腳架或穩固桌面、Python 的 rawpy 與 numpy。關閉長曝光降噪、高 ISO 降噪與任何自動暗場功能。ISO 固定一個值(例如 800,整個實驗不換)。
  2. 拍攝:快門用機械快門或 Bulb(各機型電子快門的暗場表現不同,先選一種就不要換)。曝光時間取 10、20、30、40、50、60 秒共六檔,EMVA 1288 要求至少六檔等間隔;每檔連拍兩張。為了抵消機身逐漸升溫,拍攝順序用 10、20、…、60 秒之後再倒著 60、50、…、10 秒各補一張,取同一曝光時間兩張當 A、B,而不是同一時間連拍。若相機沒有溫度欄位,用手機貼在機身旁量表面溫度當粗略參考,實驗前與實驗後各記一次。
  3. 分析:對每張 RAW 讀出感測值(不做白平衡,保留 Bayer 排列),取畫面中央 400×400 的區塊、只用同一個色彩通道(例如綠色 G1 的位置),避開邊緣的放大器發光。每個曝光時間算平均值 (兩張平均)與時間變異數 。熱像素會污染變異數,先把兩張差的絕對值大於 5 倍標準差的像素剔除再算。
  4. 擬合:numpy.polyfit(t, mean, 1) 得平均斜率 (DN/s),numpy.polyfit(t, var, 1) 得變異數斜率 與截距 。估計 DN/e⁻、暗電流 e⁻/s、讀出雜訊 e⁻。
  5. 預測與判準:若你的相機沒有暗電流抑制, 應明顯大於 0,且六個點落在一條直線上(用 檢查,預期大於 0.99);若 落在 0.1 到 2 DN/e⁻ 之外,或 為負值或遠大於 20 e⁻,先檢查有沒有忘了關降噪、黑電平是否被機身改動、ISO 是否有換。證偽條件:若 趨近 0 但 仍明顯大於 0,表示相機有暗電流抑制,這時只能信變異數這條路,用 (前提是 另外用光子轉換法在有光的條件下量得)。若六個點的平均值隨時間不是直線而是彎曲,多半是機身升溫或機內修正,這組數據只能當粗略估計,重拍並拉長每檔間的冷卻時間。
  6. 溫度加碼(可選):把相機放在冰箱旁或冷氣出風口附近冷卻,以及在暖處靜置後,各重複第 2 到 4 步,算兩個溫度的 。若兩個溫度差是 ,你的相機的有效加倍溫度估計為 。例如溫差 8 度、 變成 2.6 倍,則 度。若 幾乎不變,代表這台相機在這個範圍不符合指數模型,這正是 EMVA 1288 第 4.0 版不再報加倍溫度的理由。注意不要把相機放進結露的環境,取出時先在密封袋裡回溫。

🔗 延伸學習

  • Roger N. Clark,〈On-Sensor Dark Current Suppression〉 — 今天引用的 0.02 e⁻/s(約 2014 到 2016 年的 CMOS,10 度)、「每 5 到 6 度加倍」、「扣得掉訊號、扣不掉散粒雜訊」與鏡頭蓋兩張曝光的檢查法;首次發表 2016 年 5 月 25 日,我看到的版本最後更新標示為 2026 年 5 月 19 日。
  • Clarkvision,〈Digital Camera Review and Sensor Performance Summary〉 — 暗電流的定義、單位,以及「熱雜訊 = √(暗電流 × 曝光時間)」,內有數支 Canon 機型在不同溫度的暗電流表(我只讀到摘要,沒有逐格核對數字)。
  • EMVA 1288 Release 4.0 Linear(PDF) — 第 3 節暗電流模型(式 29、30)、第 3.2 節取消加倍溫度、第 7.1 節以六檔以上曝光時間的線性迴歸量暗電流;第 4.0 版生效日期 2021 年 6 月 16 日。
  • EMVA 1288 標準頁 — 規範頁面與下載入口,確認第 4.0 版於 2021 年 6 月起生效。

💬 問 AI

我想用鏡頭蓋量自己相機的暗電流、增益與讀出雜訊。方法:ISO 固定,曝光 10 到 60 秒共六檔(每 10 秒一檔),每檔拍兩張 RAW;取中央 400×400 的單一色彩通道,算平均值 μ(t)與時間變異數 var(A−B)/2,各對曝光時間做直線擬合;K = 變異數斜率 / 平均值斜率,暗電流 I = 平均值斜率 / K,讀出雜訊 r = sqrt(變異數截距)/K。參考的是 EMVA 1288 Release 4.0 第 3.1 節式 29、30 與第 7.1 節。
(1) 請檢查這組公式的假設:暗電流電子是卜瓦松分佈、量化雜訊忽略、單一通道;請列出會讓 K 估計偏掉的三種真實相機現象(例如黑電平修正、列行雜訊、熱像素、機內非線性修正),各說明偏差方向。
(2) 若相機有晶片上暗電流抑制導致平均值斜率接近 0,我只剩變異數可用,要怎麼取得 K,又怎麼避免把讀出雜訊當成暗電流?
(3) 請設計一個以兩個溫度估計有效加倍溫度 T_d 的步驟,並說明在 EMVA 1288 第 4.0 版已不假設指數模型的前提下,這個 T_d 應該怎麼報告才誠實。
(4) 請把回答分成三類逐條標示:「規範或文獻明確寫的」「你查證到的(附出處)」「你自己的推論」;查不到就說查不到,不要補數字;不要給任何買賣器材的建議。