2016-07-08 2 views
0

У меня довольно длинный цикл, где я обрезаю изображения в разных местах с квадратом с фиксированным размером, чтобы получить массивы numpy.
Я использовал crop от PIL Image библиотека. Затем я конвертирую его как массив numpy с np.asarray.Быстрая реализация python обрезки с padding = wrap

from PIL import Image 
import numpy as np 
im=Image.open("image.png") 
box=(left,top,left+width,top+width) 
res=np.asarray(im.crop(box)) 

Однако только обивка выполнена (когда центр вашего урожая менее чем ширина/2 бордюра) постоянно и равно 0, и я хотел бы, чтобы это было «обернуть» отступы, как в Numpy площадки документа ,

Моим решением было бы сделать что-то подобное.

array=np.asarray(Image.open("image.png")) 
padded_array=np.pad(array,((width/2,width/2),(width/2,width/2),(0,0)),"wrap") 
res=padded_array[top+width/2:top+width/2+width,left+width/2:left+width/2+width] 

Мне было интересно, был ли более эффективный способ сделать это.

ответ

1

Вы можете обернуть вокруг краев с помощью numpy.take, например, с помощью кадрирования окна 3х3:

a = numpy.arange(100).reshape((10,10)) 
a.take([8,9,10], mode="wrap", axis=1).take([9,10,11], mode="wrap", axis=0) 

Он также принимает списки списков для индексов, например, два кадрирования окна:

b = a.take([[8,9,10],[3,4,5]], mode="wrap", axis=1).take([[9,10,11],[9,10,11]], mode="wrap", axis=0) 

Затем вы можете восстановить обрезанные окна:

window1 = b[0,:,0::2].reshape(3,3) 
>>> array([[98, 99, 90], 
      [ 8, 9, 0], 
      [18, 19, 10]]) 
window2 = b[1,:,1::2].reshape(3,3) 
>>> array([[93, 94, 95], 
      [ 3, 4, 5], 
      [13, 14, 15]]) 

Для smal l, это может быть эффективно сделать так, но для больших окон вам может потребоваться указать один набор индексов за раз, в цикле.

+0

Спасибо! Я не знал этой функции. Не уверен, если это действительно быстрее, я собираюсь проверить. – jean

+0

Зависит от количества и размера окон, которые вы пытаетесь выполнить. Проблема с использованием дополнения заключается в том, что вам может понадобиться проложить несколько окон, но не другие (некоторые обертываются, а некоторые нет), и вам нужно заполнить весь массив для каждого окна, что само по себе неэффективно. – Benjamin

+0

Да, хорошее замечание, я думаю, это сводится к тому времени, когда переформатирование происходит по сравнению с бесполезным дополнением. – jean