From d51ed9d5ffb055b3d06606d23ede40994e399c96 Mon Sep 17 00:00:00 2001 From: Awin Huang Date: Thu, 8 Sep 2022 12:34:04 +0800 Subject: [PATCH] vault backup: 2022-09-08 12:34:04 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affected files: 02. PARA/03. Resources(資源)/HDR Sensor.md attachments/Pasted image 20220908123355.png --- 02. PARA/03. Resources(資源)/HDR Sensor.md | 135 ++++++++----------- attachments/Pasted image 20220908123355.png | Bin 0 -> 16880 bytes 2 files changed, 53 insertions(+), 82 deletions(-) create mode 100644 attachments/Pasted image 20220908123355.png diff --git a/02. PARA/03. Resources(資源)/HDR Sensor.md b/02. PARA/03. Resources(資源)/HDR Sensor.md index f8f18e5..9329820 100644 --- a/02. PARA/03. Resources(資源)/HDR Sensor.md +++ b/02. PARA/03. Resources(資源)/HDR Sensor.md @@ -1,78 +1,65 @@ ## HDR sensor 原理介紹 ### 1. 什麼是sensor的動態範圍(dynamic range) - sensor的動態範圍就是sensor在一幅圖像裡能夠同時體現高光和陰影部分內容的能力。 - 用公式表達這種能力就是: - - $DR = 20log\frac{i_{max}}{i_{min}}$ +sensor的動態範圍就是sensor在一幅圖像裡能夠同時體現高光和陰影部分內容的能力。 +用公式表達這種能力就是: - $i_{max}$是sensor的最大不飽和電流,也可以說是sensor剛剛飽和時候的電流 - $i_{min}$是sensor的底電流(blacklevel) +$DR = 20log\frac{i_{max}}{i_{min}}$ // DB - ### 2. 為什麼HDR在成像領域是個大問題: - 在自然界的真實情況,有些場景的動態範圍要大於100dB。 - 人眼的動態範圍可以達到100dB。 - Sensor 的動態範圍:高端的>78dB,消費級的60dB上下 - 所以當sensor的動態範圍小於圖像場景動態範圍的時候就會出現HDR問題----不是暗處看不清,就是亮處看不清,有的甚至兩頭都看不清。 - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095159571-173615205.png) - 上圖暗處看不清-前景處的廣告牌和樹影太暗看不清。 +$i_{max}$是sensor的最大不飽和電流,也可以說是sensor剛剛飽和時候的電流 +$i_{min}$是sensor的底電流(blacklevel) - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095219849-2036928694.png) - 上圖亮處看不清--遠處背景的白雲變成了一團白色,完全看不清細節。 +### 2. 為什麼HDR在成像領域是個大問題: +在自然界的真實情況,有些場景的動態範圍要大於100dB。 +人眼的動態範圍可以達到100dB。 +Sensor 的動態範圍:高端的>78dB,消費級的60dB上下 +所以當sensor的動態範圍小於圖像場景動態範圍的時候就會出現HDR問題----不是暗處看不清,就是亮處看不清,有的甚至兩頭都看不清。 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095159571-173615205.png) + 上圖暗處看不清-前景處的廣告牌和樹影太暗看不清。 -3. 解決HDR問題的數學分析 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095219849-2036928694.png) + 上圖亮處看不清--遠處背景的白雲變成了一團白色,完全看不清細節。 + +### 3. 解決HDR問題的數學分析 根據前邊動態範圍公式 -DR = 20log 10(i_max / i_min); // dB - -所以從數學本質上說要提高DR,就是提高i_max,減小i_min; - -對於10bit輸出的sensor,從數學上來說,i_max =1023,i_min =1; - -動態範圍DR = 60; - - 對於12bit輸出的sensor,DR = 72; +$DR = 20log\frac{i_{max}}{i_{min}}$ // DB +所以從數學本質上說要提高DR,就是提高$i_{max}$,減小$i_{min}$ +對於10bit輸出的sensor,從數學上來說,$i_{max}=1023$,$i_{min}=1$ +動態範圍DR = 60 +對於12bit輸出的sensor,DR = 72 所以從數學上來看,提高sensor 輸出的bit width就可以提高動態範圍,從而解決HDR問題。 - 可是現實上卻沒有這麼簡單。 - 提高sensor的bit width導致不僅sensor的成本提高,整個圖像處理器的帶寬都得相應提高,消耗的內存也都相應提高,這樣導致整個系統的成本會大幅提高。所以大家想出許多辦法,既能解決HDR問題,又可以不增加太多成本。 -## 二.HDR Imaging Digital Overlap +## HDR Imaging Digital Overlap -Digital Overlap是目前比較流行的sensor H DR 技術,在監控與車載相機等領域的應用非常廣泛。Sony於2012年在監控相機市場首先推出基於DOL(digital overlap)HDR技術的圖像傳感器,之後OV與Onsemi也都推出了與DOL類似的HDR技術的圖像傳感器,而且應用領域不局限於監控這種傳統HDR imaging的市場,而且擴展到了Automotive camera市場。現在Sony已經推出了第二代支持虛擬通道DOL HDR技術的sensor。 +Digital Overlap是目前比較流行的sensor HDR 技術,在監控與車載相機等領域的應用非常廣泛。Sony於2012年在監控相機市場首先推出基於DOL(digital overlap)HDR技術的圖像傳感器,之後OV與Onsemi也都推出了與DOL類似的HDR技術的圖像傳感器,而且應用領域不局限於監控這種傳統HDR imaging的市場,而且擴展到了Automotive camera市場。現在Sony已經推出了第二代支持虛擬通道DOL HDR技術的sensor。 - 1.什麼是時域多幀HDR技術 +### 1. 什麼是時域多幀HDR技術 相機在時間上連續輸出由欠曝到過曝的圖像,然後做圖像融合,得到HDR圖像。 ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095356429-1225500631.png) -  融合後HDR圖像 - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095500036-1147852374.png) -比較典型的一種融合方法是根據luminance,contrast,motion等條件,對第K幀圖像的像素[i,j]給出權重。Wij,k 是第K幀,位置i,j像素的權重,Xk((i,j)是原始像素值,Xf(i,j)是融合後的像素值。公式如下  - +比較典型的一種融合方法是根據luminance,contrast,motion等條件,對第K幀圖像的像素`[i,j]`給出權重。$W_{ij,k}$是第K幀,位置i,j像素的權重,$x_k(i,j)$是原始像素值,$x_f(i,j)$是融合後的像素值。公式如下: ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095726682-775383621.png) - 對彩色圖像,權重的計算會考慮色彩的飽和度等因素。 - 2.傳統時域多幀HDR技術存在的局限 +### 2. 傳統時域多幀HDR技術存在的局限 由於傳統時域多幀是基於連續曝光的整幀圖像(Frame Based)進行融合,所以圖像之間的間隔時間就是一幀圖像的周期,由此會產生很多artefacts: - 場景內物體增減 +1. 場景內物體增減 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095915848-294335122.png) -![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095915848-294335122.png) - -近距離物體快速移動形成拖影 - -![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095948969-1372705839.png) - -Color artefact +2. 近距離物體快速移動形成拖影 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412095948969-1372705839.png) +3. Color artefact ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100054082-388198519.png) Frame based的多曝光HDR技術常用於still image 的capture,也有視頻HDR 採用這種技術,比如sensor以60fps的幀率交替輸出長短曝光,融合後輸出30fps的HDR圖像。 @@ -83,9 +70,9 @@ Frame based的多曝光HDR技術常用於still image 的capture,也有視頻HD 早期的HDR video有採用這種技術,自從DOL技術出現後,這種Frame based Video HDR技術就逐漸退出歷史舞台了。 - 3.什麼是DOL HDR +### 3. 什麼是DOL HDR -DOL HDR 也叫做line interleaving HDR 技術。以兩曝光DOL為例,sensor每行會以長短曝光兩次先後輸出,從readout角度來看,就是長曝光幀與短曝光幀line interleaving 依次輸出,如下圖,第一行L輸出,第一行S輸出,第二行L輸出,第二行S輸出,以此類推。 +DOL HDR 也叫做 line interleaving HDR 技術。以兩曝光 DOL 為例,sensor每行會以長短曝光兩次先後輸出,從readout角度來看,就是長曝光幀與短曝光幀line interleaving 依次輸出,如下圖,第一行L輸出,第一行S輸出,第二行L輸出,第二行S輸出,以此類推。 ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100529435-170192984.png) @@ -96,72 +83,56 @@ frame based HDR,長短曝光幀的間隔是一個幀週期,也就是必須  對於DOL HDR而言,由於line interleaving(行的交織),存在兩幀的overlap,等於一幀輸出沒結束,下一幀就來了,長短曝光幀的間隔大大縮小了。 從下圖可見,長曝光幀與短曝光幀overlap了一部分,所以這種技術叫digital overlap。 - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100703466-1912064866.png) - 4.DOL長短曝光幀的時間間隔 +### 4. DOL 長短曝光幀的時間間隔 -前邊說過,Frame based HDR的長短曝光幀的間隔是一幀的時間,那麼DOL HDR的長短曝光幀的時間間隔是多大呢? +前邊說過,Frame based HDR 的長短曝光幀的間隔是一幀的時間,那麼 DOL HDR 的長短曝光幀的時間間隔是多大呢? 如果先輸出長曝光的話 - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100717894-1595515136.png)  如果先輸出短曝光的話 - ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100822480-184812752.png)  T= long exposure 的時間 +所以當然是先輸出長曝光,這樣T(時間間隔)會更小。 -所以當然是先輸出長曝光,這樣T(時間間隔)會更小。。 - - 5.DOL長短曝光時間比與動態範圍擴展 +### 5. DOL 長短曝光時間比與動態範圍擴展 以兩曝光DOL 為例 +$\text{Exposure ratio} = \frac{\text{Long exposure time}}{\text{short exposure time}}$ -Exposure ratio = Long exposure time/ short exposure time - -假設Exposure ratio = 16,假設在xinhao 沒有飽和的條件下,相當於曝光最大值增大了16倍:2^4。也就是動態範圍擴大了4個bit。 - +假設Exposure ratio = 16,假設在信號沒有飽和的條件下,相當於曝光最大值增大了16倍:$2^4$。也就是動態範圍擴大了4個bit。 以此類推,每增加一個曝光幀,如果exposure ratio =16,動態範圍就可以擴大4bit。 - 按照一般HDR sensor 單曝光為12bit來算的話,4曝光就可以讓sensor輸出的動態範圍擴大到24bit(12+4+4+4)。 - exposure ratio 也不是越大越好,exposure ratio會受到三方面的製約,圖像質量,sensor設計以及isp line delay buffer。 - 從圖像質量上來說,短曝光時間越短,圖像噪聲越高,長曝光越長,motion的影響越大。Exposure Ratio越大,在圖像融合後的SNR drop也越大。 - 從sensor設計上來說,長短曝光之比受到讀出電路的限制,sony的DOL第二代採用虛擬通道技術一定程度改善了這個限制。 - -從ISP的角度來說line d elay buffer 也限制了最大曝光時間。在短曝光行出來之前,第一個長曝光行應該還在delay buffer裡,這樣才能兩者對齊好給後面的frame stitch操作。而長短曝光比越大,需要的line delay buffer就越大。 +從ISP的角度來說line delay buffer 也限制了最大曝光時間。在短曝光行出來之前,第一個長曝光行應該還在delay buffer裡,這樣才能兩者對齊好給後面的frame stitch操作。而長短曝光比越大,需要的line delay buffer就越大。 ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412100950046-469714366.png)  對於sensor做hdr融合case而言,line delay buffer size就是固定的,所以ISP傾向於在isp這端做HDR融合,這樣可以更靈活的設計。(Maver注:對於車載而言,帶寬是個主要關注點,所以大部分用戶不會選擇在ISP側做HDR融合) -6.DOL的局限 +### 6. DOL的局限 -Sony在推出DOL的時候,宣傳DOL是'準同時'輸出長短曝光。既然是'準同時',那就還不是同時,所以也會有一些典型時域多幀HDR的圖像質量問題,同時DOL也有一些特有的IQ問題。 +Sony在推出DOL的時候,宣傳DOL是**準同時**輸出長短曝光。既然是**準同時**,那就還不是同時,所以也會有一些典型時域多幀HDR的圖像質量問題,同時DOL也有一些特有的IQ問題。 -HDR Transition Artefacts +1. HDR Transition Artefacts + 可以從下左圖看到composition noise造成的edge,這種edge有時候會誤導機器視覺。 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101147526-216923810.png) -可以從下左圖看到composition noise造成的edge,這種edge有時候會誤導機器視覺。 + 從DOL hdr的noise profile可以看出來,如下圖,在HDR拼接處,可以看到SNR的顯著變化,叫做snr drop,當SNR drop大的時候,就會出現明顯的edge,如上圖所示。 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101213313-292299226.png) + 曝光比越小,SNR drop就越小, 可以想見,如果曝光比為1,也就沒有snr drop了。反之,曝光比越大,動態範圍越大,snr drop也越大,如下圖所示。 + ![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101406902-1922414693.png) -![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101147526-216923810.png) + 2. Flicker +  交流電供電光源造成的flickering,如下圖: +  ![[Pasted image 20220908123355.png]] -從DOL hdr的noise profile可以看出來,如下圖,在HDR拼接處,可以看到SNR的顯著變化,叫做snr drop,當SNR drop大的時候,就會出現明顯的edge,如上圖所示。 - -![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101213313-292299226.png) - -曝光比越小,SNR drop就越小, 可以想見,如果曝光比為1,也就沒有snr drop了。反之,曝光比越大,動態範圍越大,snr drop也越大,如下圖所示。 - -![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101406902-1922414693.png) - - Flicker - -交流電供電光源造成的flickering,如下圖: - -交流電供電光源造成的flickering,如下圖:![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101441184-199810703.png) + 交流電供電光源造成的flickering,如下圖:![](https://img2020.cnblogs.com/blog/1251718/202004/1251718-20200412101441184-199810703.png)  為了避免banding,就得讓最小曝光時間是半週期的整數倍。 diff --git a/attachments/Pasted image 20220908123355.png b/attachments/Pasted image 20220908123355.png new file mode 100644 index 0000000000000000000000000000000000000000..12d9dcddfafbab2de07ad428b169b19c1edad026 GIT binary patch literal 16880 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