2012-10-04 54 views

回答

17

我發現很多關於這個主題和許多答案的問題,但是對於數據由網格上的樣本(即矩形圖像)組成的常見情況並沒有效率,並且表示爲一個numpy數組。該函數可以將列表作爲x和y座標,並且將執行查找和求和而不需要循環。

def bilinear_interpolate(im, x, y): 
    x = np.asarray(x) 
    y = np.asarray(y) 

    x0 = np.floor(x).astype(int) 
    x1 = x0 + 1 
    y0 = np.floor(y).astype(int) 
    y1 = y0 + 1 

    x0 = np.clip(x0, 0, im.shape[1]-1); 
    x1 = np.clip(x1, 0, im.shape[1]-1); 
    y0 = np.clip(y0, 0, im.shape[0]-1); 
    y1 = np.clip(y1, 0, im.shape[0]-1); 

    Ia = im[ y0, x0 ] 
    Ib = im[ y1, x0 ] 
    Ic = im[ y0, x1 ] 
    Id = im[ y1, x1 ] 

    wa = (x1-x) * (y1-y) 
    wb = (x1-x) * (y-y0) 
    wc = (x-x0) * (y1-y) 
    wd = (x-x0) * (y-y0) 

    return wa*Ia + wb*Ib + wc*Ic + wd*Id 
+0

嗨亞歷克斯,我只是看同樣的事情,你的實現看起來不錯。我掌握了基本用法,但是您能否提供一些高級示例(帶有幾個座標)以使此答案更好? – ffriend

+0

@friend:$ im $是一個2D numpy數組,$ x $和$ y $都是具有相同長度的普通python雙精度列表。 –

+0

謝謝,亞歷克斯。我還發現代碼對於2D NumPy數組非常有效。但是,應該關心索引和圖像邊界。例如,如果「im.shape ==(10,10)」和「x == 9」,然後是「x0 == 9」和「x1 == x0 + 1 == 10」,這將產生「 IndexError'。解決這個問題的最簡單的方法是將圖像擴展爲具有一個額外的列和一個額外的行(例如,使用值'im [:,-1]'和'im [-1,:]')。儘管在大多數實際情況下(如我所使用的仿射變換),應該使用更先進的技術。無論如何,感謝這個強大的矢量化的好例子。 – ffriend