Stereo Matching using OpenCL

上一篇的OpenCL版本,速度快了不少,但是顯卡會 freeze ....修改 TDR Level 讓 driver可以跑久一點

 

code

Continue reading "Stereo Matching using OpenCL"

Stereo Matching using Block SAD

這裡假設左右眼兩張影像已經經過 rectification,在 epipolar line 上限制一個小範圍的search range用以加速,簡單用 SAD 計算最小的左右視差作為 disparity。

使用 middlebury 的 dataset,勉強可以看出深度,但畢竟不到 100 行的小品 code 所以品質很差XD。

 

im0

作為使用不同 window size 計算 SAD的比較,下圖左是用較大 window size 的結果,較為密實但粗略,小的 window size 則是會有較精確的但易破碎的結果;

因此才有了 coarse to fine 的演算法策略,先計算大的 window size 或低解析度的影樣匹配,然後再重複用小的 window size在鄰近 disparity 位置搜尋精確解。

但是 coarse to fine 也有無法解決的地方,太強烈的 smooth 特性反而失去細節,舉例來說,位於半島型的突出小東西或獨立的細小物體 ( 下圖綠框部分 ) ,在這些 window 中,真正要比較差異的區域其實是很少的,只在 window 正中間一小塊,越是 coarse 的範圍看到其他的部份也越多, 結果易忽略細小的目標物,而收斂成適合周邊範圍的 disparity;造成一種「穿越」或「填補」的現象。 coarse layer 定義下來的 disparity 若離目標物深度很遠,在 fine layer 相鄰深度的 refine 就會失敗 ( coarse layer 就消失的東西救不回來 );許多論文靠著定義特殊的 label 或 segment 來區分這些小區塊做特別處理。Middlebury stereo Evaluation 上目前最好的效果算是這類方法。

im00

sm

後面附上 source code,使用 openCV library讀寫圖

Continue reading "Stereo Matching using Block SAD"

OpenCL Box Filtering

一個很 tricky 的點跟 CPU 計算不一樣,這邊如果把 main.cpp 呼叫 kernel 的 devBy 全部換成 devBx,在 thread 數不超過顯卡 core 負荷時(也就是一個 round 可以跑完 kernel ),結果是不會變的。可以嘗試在大圖需要多個 round 才能跑完 kernel 時就會出錯。

其實因為所有 thread 同步 inplace filtering 寫入關係,當寫入任一點時其他點的 source 已經不會需要再用到,所以不會有 propagate 的問題

讀寫檔案使用 OpenCV,減少 memory access 次數所以 x 和 y 方向 filtering 分開

Continue reading "OpenCL Box Filtering"

Image Deconvolution: An Introduction

如果一張影像拍照時手振了,或是沒對好焦模糊了,通常我們會值接刪除重拍,但在某些特殊應用的場合,我們會需要如 CSI 犯罪現場中用的神奇補強手段,其實電視劇中只是稍微誇大效果 (我們也沒用這麼酷炫的UI ),但理論上是可行的,這個過程叫做 deconvolution 或稱為 deblur。

Image Deconvolution 嘗試將所有光學過程反轉,求解符合數學模型的原始射線。本文將會帶到基本的數學模型及簡單例子;並且整理分類常見的解法。

Deconvolution 做法跟把模糊照片銳化( Sharpness filtering ) 有數學模型上的根本差異,並且在某些特殊強況有著決定性的差異。知道了以後在判斷什麼影像該用什麼方法補救上會有不少幫助。

範例程式給讀者參考,有興趣的讀者可以先玩看看再開始閱讀本文,比方說將下圖變清楚 (參數為 13x13 tap 的 circle PSF )

Continue reading "Image Deconvolution: An Introduction"

HDR / Tonemapping essentials

Raw檔本身就是超過 8-bit 的 HDR 影像

看到很多人為了要產生 HDR 檔案,卻是用一個 raw 檔調整曝光輸出包圍曝光影像,爾後再丟 Photoshop 合併為 HDR 影像。這明顯是脫褲子放屁的過程,甚至會使畫質下降,直接把 raw 轉存成 HDR 檔就好了 (只要是32-bit的 container 都裝得下,如 TIF、HDR、EXR、DNG)。

會用到複數張 8-bit 包圍曝光影像是應用在其他消費機僅能輸出 JPG 的情況。而單眼相機的 sensor 通常是在 12~14bit,當然若需要更高的 dynamic range 如產生 32-bit HDR,可以考慮合併複數張的 raw 影像。

產生 HDR 影像的演算法

很多演算法 (Photomatix) 會使影像變模糊

我直接點出因為 photomatix 的演算法是使用 gradient domain compression (SIGGRAPH02)。在解 Poisson equation 時由於是最小化 L-2 norm,會有平均化誤差的特性,在減低 halo effect 的同時也把影像變糊了。

而 Adobe 新版的 lightroom 使用了新的演算法 ( Local Laplacian Filtering )。可以減低模糊的情況,並且同時也沒有 halo effect。演算法 / Demo / Paper

HDR 和 Tonemapping 是兩件事情

HDR影像一般指色彩強度超過 8-bit [0~255] 範圍的影像,而 tonemapping 則是將其動態範圍壓縮回 8-bit 的過程,才能使其顯示在螢幕上。

經典的 tonemapping 演算法

Effective Chromatic Noise Reduction (Noiseware-like)

無論我們在 RGB colorspace 怎麼解永遠都不好,消除 chromatic noise 的同時一定會有機會影響細節,問題就是在 RGB channel 隱含了很大的 intensity 成分。必須要轉換到有 color-phase 和 color-saturation 的空間,完整的將 luminance 區隔開來,然後處理那些對人眼影響不大,但不規則卻會很惱人的 noise channels。 如Lab、YUV、HSV、YCbCr;都是不錯的選擇。

  1. transform RGB image to luminance-split color space.
  2. smooth the non-luminance channels (may use bilateral filtering), NOTE that the smooth window size must be large enough (eg. 21x21 pixels).
  3. well-blended with original channels if we don't want to lose too much color especially in small object region.
  4. inverse transform colorspace.
  5. Done.

sample source

與主流 denoise 軟體比較,canon DPP、Noiseware,都在強 edge 附近使用了較多原圖的顏色,所以邊緣的 chromatic 雜訊也較多,但是更有機會保留色彩。