在NumPy中加速許多像素位置的線性插值

[英]Speeding up linear interpolation of many pixel locations in NumPy


I've tried to replicate the main bottleneck in one of my programs.

我試着在我的一個程序中復制主要的瓶頸。

I want to get the linearly (or rather bilinearly) interpolated values of several non-integer pixel values simultaneously. It is not the case that each pixel coordinate is perturbed in the same way. Below is a complete/minimal script along with comments that demonstrates the problem. How can I speed up the calculation of result?

我想同時得到幾個非整數像素值的線性(或者說是雙線性)插值。並不是每個像素坐標都以同樣的方式擾動。下面是一個完整的/最小的腳本以及演示問題的注釋。我怎樣才能加快計算結果?

import numpy as np
import time

im = np.random.rand(640,480,3) # my "image"
xx, yy = np.meshgrid(np.arange(im.shape[1]), np.arange(im.shape[0]))
print "Check these are the right indices:",np.sum(im - im[yy,xx,:])

# perturb the indices slightly
# I want to calculate the interpolated
# values of "im" at these locations
xx = xx + np.random.normal(size=im.shape[:2])
yy = yy + np.random.normal(size=im.shape[:2])

# integer value/pixel locations
x_0 = np.int_(np.modf(xx)[1])
y_0 = np.int_(np.modf(yy)[1])
x_1, y_1 = x_0 + 1, y_0 + 1

# the real-valued offsets/coefficients pixels
a = np.modf(xx)[0][:,:,np.newaxis]
b = np.modf(yy)[0][:,:,np.newaxis]

# make sure we don't go out of bounds at edge pixels
np.clip(x_0,0,im.shape[1]-1,out=x_0)
np.clip(x_1,0,im.shape[1]-1,out=x_1)
np.clip(y_0,0,im.shape[0]-1,out=y_0)
np.clip(y_1,0,im.shape[0]-1,out=y_1)

# now perform linear interpolation: THIS IS THE BOTTLENECK!
tic = time.time()
result = ((1-a) * (1-b) * im[y_0, x_0, :] +
             a  * (1-b) * im[y_1, x_0, :] +
          (1-a) *    b  * im[y_0, x_1, :] +
             a  *    b  * im[y_1, x_1, :] )
toc = time.time()

print "interpolation time:",toc-tic

1 个解决方案

#1


5  

Thanks to @JoeKington for the suggestion. Here's the best I can come up with using scipy.ndimage.map_coordinates

感謝@JoeKington的建議。下面是使用scipy.ndimage.map_coordinate得到的最好結果

# rest as before
from scipy import ndimage
tic = time.time()
new_result = np.zeros(im.shape)
coords = np.array([yy,xx,np.zeros(im.shape[:2])])
for d in range(im.shape[2]):
    new_result[:,:,d] = ndimage.map_coordinates(im,coords,order=1)
    coords[2] += 1
toc = time.time()
print "interpolation time:",toc-tic

Update: Added the tweaks suggested in the comments and tried one or two other things. This is the fastest version:

更新:添加了評論中建議的微調,並嘗試了一兩件其他的事情。這是最快的版本:

tic = time.time()
new_result = np.zeros(im.shape)
coords = np.array([yy,xx])
for d in range(im.shape[2]):
    ndimage.map_coordinates(im[:,:,d],
                            coords,order=1,
                            prefilter=False,
                            output=new_result[:,:,d] )
toc = time.time()

print "interpolation time:",toc-tic

Example running time:

示例運行時間:

 original version: 0.463063955307
   better version: 0.204537153244
     best version: 0.121845006943

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2012/02/23/73019e004d01ac112fa7b57f1daebb7.html



 
粤ICP备14056181号  © 2014-2021 ITdaan.com