我有一个非常长的循环,我在不同的位置裁剪图像,有一个固定大小的平方窗口,以获得numpy数组。
我正在使用来自crop图像库的PIL。然后,我将其转换为带有numpy的np.asarray数组。
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 pad文档中一样。
我的解决办法就是做这样的事。
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]我想知道是否有一种更有效的方法来做到这一点。
发布于 2016-07-08 15:20:20
您可以使用numpy.take对边缘进行包装,例如,使用3x3裁剪窗口:
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]])对于小窗口,这样做可能是有效的,但是对于较大的窗口,您可能希望在一个循环中一次指定一组索引。
https://stackoverflow.com/questions/38267221
复制相似问题