前言:
為什麼會發現 Bayer-Raw 直接拿去做 padding 會壞掉?
這源於我有天看到開源 ISP 的 issue ,
裡面說壞點校正 (Dead Pixel Correction, DPC) 過程中,
永遠都抓不到第一個點。(推測是座標 [0, 0])
這就見鬼了,
怎麼可能只是抓不到第一個點?
往下查才發現其實是 padding 的問題,
這開源 ISP 用 5*5 的稀疏遮罩去抓壞點。
(稀疏遮罩見圖右下角,因為 Bayer 每相隔一個像素才是同色,所以這在同色上是 3*3 的相鄰域)
隨後這套 DPC 有兩個條件來決定這是不是壞點?
- 中心點是否 大於/小於 周圍八點的 最大值/最小值?
- 中心點與周圍八點的絕對差值是否都大於閾值?
兩個條件都成立的情況下,我們才能說這中心點是壞點。
問題出在 padding,
我看到的時候這 DPC 用的是 SciPy 的 Mirror Padding 並補二,
也就是說在圖形邊緣補兩行/列出去。
結果就會如下圖:

SciPy Mirror Padding 就是最邊緣的像素不複製,從 index 1 開始複製並外翻,
當我們看原圖 index [1, 1] 的紅色1 會發現這方式會複製到自己。
複製自己的話上面兩個條件都不會成立(#。
因為條件一會等於、條件二會有一個差值永遠是 0。
這邊我用了 CFA 的想法,
以 BGGR 舉例把同顏色的先抓起來,做顏色的 sub padding。
也是用 Mirror Padding(同 Numpy 的 Reflect Padding,兩個函式庫行為相同,問題在於這種 Padding 對 Bayer 不友好),但是我只補 1,因為另外一個空間要留給另一個顏色。
第二步驟再依序補回原圖:

實際上 issue 留言者敘述有錯,
並不是 [0, 0] 這個像素更正不了,
最外圈反而是好的,第二圈的井字區域才更正不了。
假設 Bayer圖為 M*N,受影響範圍稱 H1
(井字區域:row[1]col[:], row[m-2]col[:], row[:]col[1], row[:]col[n-2] )都更正不了。
做完這個 CFA 修正,H1 的偵測率從 0% -> 100%。
PR連結在這邊。
這問題重要的是做鄰域計算的補 padding 都會遇到,
像是 Demosaic, BNR, LSC等,所以要特別注意。
發佈留言