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 演算法