VFX hw02 Report

組員:資訊三    b93902008    任怡鴻    資訊三    b93902082    鄒志鴻


MSOP

Feature Matching

Cylindrical Warping

Alignment

Multi-Band Blending

Result

Code Structure

Feedback

Reference

I. MSOP

實作步驟

(1) 將輸入的image建成Gaussian pyramid,我們在這次的作業中建了四層。

(2) 在這裡,我們 對於feature point R 值設定一個threshold 為100,並以5 x 5 為一個local region,選出其中最大的值為代表。
(3) 在每一個 feature point 對 x 方向和 y 方向做 gradient, 大小為 11 x 11, 針對這個區間, 我們計算每一點的 gradient magnitude 並 apply sigma = 1.5 的 gaussian X. 計算此點的角度. 我們將 360 度分為 10 個 群組, 依照 該點的 角度, 我們將 X 加進 那個 群組. 找出 36 組中最大的值. 此為這個 feature point 的 major orientation

(4) 在該點張開 41 x 41 的 window. 我們將暫存矩陣的每一個點 加上旋轉矩陣並且平移至 feature point 的位置找尋 sample 點. feature point 為暫存矩陣的原點。將40 x 40 的 矩陣 化為 64 個正方塊, 每一塊的值為該 5 x 5 pixel value 的平均。將feature point 的座標 和 64 個值 紀錄起來。這 2 x 64 dimension 就是這個feature point 的descriptor,也就是未來辨識這個物件的依據。

執行結果

生成 00.txt, 01.txt ... 等,裡面包含feature point的位置與 8 x 8 的 Descriptor。


II. Feature Matching

實作步驟

(1) 我們將P張影像上已找到的Feature Point和Descriptor輸出成P個文字檔案。內容格式為:
[feature point column] [feature point row] [8x8 feature point descriptor] [\n]

(2) 將輸出的文字檔中的Feature Point Descriptor兩兩比對,在這裡我們使用平方和和一Threshold進行feature matching的篩選,如果有相似的點就予以保留,並以綠點標示成"Match",如果都沒有找到相似的feature point則以紅點表示為"not match"。

(3) 將篩選過的Matching point輸出成P個檔案,供之後Alignment使用。

執行結果    

執行結果會(1)生成 fp00.txt, fp01.txt ... 等,和(2) 生成mp00.jpg ~ mpxx.jpg,TXT裡面包含match point的位置(x,y, 0);(後面多一個零是原本想要做 rotation用的。)JPG則是讓我們肉眼比對看結果是否正確,綠點表示match,而紅色點表示不match。

III. Cylindrical Warping

實作步驟

(1) 參考老師的投影片,我們假設將寬度為W pixels的image,貼附在一個半徑為f 的圓柱體上。我們假定這張影像在這個圓柱體的張角為θ(單位為弳度),於是便可求得f θ = W。

(2) 將影像座標(x, y)變換成(x', y'):

執行結果

原始圖檔(lena_in.jpg 512x512)

After warping 45° (lena_cy.jpg 474x512)

IV. Alignment

(a) RANSAC

實作步驟

(1) 在A、B兩張圖中,在B圖上任意取一個點,取K次(我令K=100)。

(2) 在K次中,令第i次取到的點Pi對到的A圖上的Qj其有一個(Δx, Δy)的位移,此時我們再將B圖中所有的點都套用這個(Δx, Δy)的位移,看看能不能match到A圖上任何的一個點。

(3) 如果Pi 對應到Qj 的位移(Δx, Δy) 有最多的點「同意」這個變換式,那我們就得到了這兩張圖的Alignment了。

(b) DRIFT

實作步驟

(1) 這次我們採用的測資只有橫向stitching,故我們假設對於P張的圖形,其對y軸的位移誤差不會超過P*2 個pixels。

(2) 在做完RANSAC找出最佳的Alignment後,我們預先算出最後panorama的高度H,並與原始檔案的高h相減,如果(H-h) > P*2,那我們便將(H - h - P*2 ) 中間的差距分散於P-1 個圖與圖間的Alignment中,然後將之調整回來。

DRIFT前(drift_before,4353 x 580

DRIFT後(drift_after.jpg, 4353 x 532


V. Multi-Band Blending v.s. Interpolation Blending

在這次的作業中我們除了Interpolation Blending以外,還做了Multi-Band Blending。

實作步驟

(1) 將兩張Alignment相鄰的影像取出「疊合」的部分:subA、subB。

(2) 對subA、subB各自建造Gaussian Pyramid得到GA、GB,在這次的作業中我們做了三層。目的是希望從不同scale的圖中分離出不同頻度的資訊。
(3) 對GA、GB兩個pyramid經由REDUCE和EXPAND的步驟,建造出兩個Laplacian pyramid,Laplacian pyramid與Gaussian Pyramid的關係如右式:Ln = Gn - EXPAND(Gn-1),L0 = G0
(4) 建造一個新的Laplacian Pyramid LS,在這次的作業中,我們讓LS的左半部等於LA,右半部等於LB。實際在原文paper上的實作中:LS的中線部分應該為(LA+LB)/2。

(5) 得到LS後,將依照Laplacian Pyramid與Gaussian Pyramid的關係導出兩張圖疊合的部分,然後代回原圖的位置。Multi-Band Blending就完成了。

執行結果

Interpolation

Multi-Band Blending

說明:這是尚未warping就align的結果,主要差別可見下方草皮。左圖為先前做的線性內插Blending,右圖則為Multi-Band Blending,可以很明顯地看出差異;線性內插在中間部分產生鬼影,而Multi-Band Blending即使在草皮部分沒有align好,卻能很自然地將兩者連接。

 

VI. Artfacture

1) Warping Angle: 15° , source image size: 384x512 (18 pics)

(3) Warping Angle: 15° , source image size: 384x512 (18 pics)

(3) Warping Angle: 30° , source image size: 553x700 (16 pics)

VII. Code Structure

檔案名稱 主要功能 Command INPUT OUTPUT

 MSOP.dev, myfunction.cpp

(1) Feature Detection
(2) Feature Matching

輸入圖片的張數

in00~inxx.jpg

00.txt~xx.txt, fp00.txt~fpxx.txt
mp00~mpxx.jpg

 src/ransec.dev, src/ransec_a.cpp

(1) Cylindrical warping
(2) Alignment(RANSAC, Drift)
(3) Multi-Band Blending

輸入圖片的張數 、warping角度

fp00.txt~fpxx.txt, in00~inxx.jpg

result.jpg

[程式碼與可執行檔下載]


VIII. Feedback

(1)這次作業的比前一次困難許多。我們遭遇了許多觀念上與實作上的困難。首先是"拍攝原始照片"的問題,在自己拍攝的照片中,不同角度的曝光程度不同,結果導致在不同照片裡我們得到的unmatch點相當地多,但使用課程網頁上提供的測資效果就還蠻好的。而我們所使用的Multi-Band Blending也遇到近乎相同的情況,也就是雖然我們已經將交界處鬼影的問題解決了,但因問影像間的對比度實在差太多,用肉眼看結果時還是能夠感覺到交界在哪裡。故我們猜想要有好的結果應該還要先對source image做normalization,但因時間緊迫故沒有做出來。
(2)
最讓我們感到困難的是MSOP找出Feature Point,如果Feature point找得好,之後Matching和Stitching都不成問題,這個部份觀念很難理解,我們反覆研究討論了多次,最後才得到不錯的結果。
(3)其次我們遭遇到的問題是在Matching point和RANSAC這兩個步驟,因為其都需要各自設一個適當的Threshold,來決定inlier以及套用的alignment,而且前後兩者的threshold都會影響到結果,故我們土法煉鋼反覆嘗試加上估算可能的機率找出最佳的threshold,每跑一次大約都要花上幾十秒,相當地費工夫。
(4)最後階段也很難實作的是Multi-Band Blending,因為Blending若以線性內插的作法只要將原始圖檔的邊框乘上特定的weight即可,但Multi-Band Blending卻要將兩張圖找出"疊合的區域",放大縮小、分成數層Scale處理然後再貼回去,為了這些繁複的步驟我們吃了許多Segment Fault!然而最後用Multi-Band做出"草皮自然地生成"對比"線性內插的鬼影草皮"真是相當地有成就感!但是因為我們Alignment上有點瑕疵、加上Source Image沒有做Normalization,故最後Multi-Band Blending的效果也被打折。
(5)一開始在寫Stitching部份時,其實是往Recognizing Panoramas和Bundle Adjustment的方向來做的,我們一開始作RANSAC時是採用一個三維的矩陣,其中包含△x, △y, θ三個參數,但是因為若將圖片旋轉之後我們就不知道該怎麼搭配Blending ,只好乖乖改成x,y軸位移的Alignment。再來是因為我們Feature Point找到的結果並不是很robust,故也無法再作Recognizing Panoramas。
(6) 這次的作業非常有趣,對於相機的特性與影像在3D上投影等又多了一層認識,然而可能我們這組兩人的藝術家天份都不太夠,每次都沒辦法做出漂亮的Artifacture,有點小失望。


IX. Reference