2016-03-02 4 views
3

У меня есть около 10000 изображений в оттенках серого в массиве numpy (10000 x 480 x 752) и вы хотите изменить их размер с помощью функции imresize от scipy.misc. Он работает с построением цикла for вокруг всех изображений, но это занимает 15 минут.Изменение размера партии изображений в numpy

images_resized = np.zeros([0, newHeight, newWidth], dtype=np.uint8) 
for image in range(images.shape[0]): 
    temp = imresize(images[image], [newHeight, newWidth], 'bilinear') 
    images_resized = np.append(images_resized, np.expand_dims(temp, axis=0), axis=0) 

Есть ли способ сделать это быстрее с помощью подобной функции? Я посмотрел в apply_along_axis

def resize_image(image): 
    return imresize(image, [newHeight, newWidth], 'bilinear') 
np.apply_along_axis(lambda x: resize_image(x), 0, images) 

, но это дает ошибку

'arr' does not have a suitable array shape for any mode 

.

+1

Вы должны указать код, по которому вы можете изменить размер изображений, если хотите, чтобы кто-нибудь вам помог .. см. Https://stackoverflow.com/help/mcve – hruske

+0

Я не уверен, что это то, что вы ищете, но взгляните на это: http://stackoverflow.com/questions/13242382/resampling-a-numpy-array-representing-an-image – MaxU

+0

У вас есть определенный набор значений для 'newHeight',' newWidth', который вы работают? Вы понижаете дискретизацию или повышаете выборку, или это может быть так или иначе? – Divakar

ответ

3

время давно, вероятно, потому, что resize давно:

In [22]: %timeit for i in range(10000) : pass 
1000 loops, best of 3: 1.06 ms per loop 

поэтому время проводят с помощью функции resize: Векторизация не улучшит производительность здесь.

Расчетное время для одного изображения составляет 15 * 60/10000 = 90 мс. resize использовать сплайны. Он хорош для качества, но требует много времени. если целью является уменьшение размера, повторная выборка может дать приемлемые результаты и быстрее:

In [24]: a=np.rand(752,480) 

In [25]: %timeit b=a[::2,::2].copy() 
1000 loops, best of 3: 369 µs per loop # 

In [27]: b.shape 
Out[27]: (376, 240) 

Это примерно в 300 раз быстрее. Таким образом, вы сможете достичь этой цели за несколько секунд.