He tratado de replicar el cuello de botella principal en uno de mis programas.Acelerando la interpolación lineal de muchas ubicaciones de píxeles en NumPy
Quiero obtener los valores de linearly (or rather bilinearly) interpolated de varios valores de píxel no enteros simultáneamente. Es no el caso en que cada coordenada de píxel se perturba de la misma manera. A continuación se muestra un guión completo/mínimo junto con comentarios que demuestran el problema. ¿Cómo puedo acelerar el cálculo de 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
Cualquier razón por la que estás evitando 'scipy.ndimage.map_coordinates'? (Por ejemplo, ¿quieres evitar una dependencia de scipy.ndimage?) Si no, es la función que deseas. –
@JoeKington No estaba al tanto de esto, déjame ver si puedo usar esta función y si es más rápida. Gracias. – YXD