首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用padding=wrap快速实现裁剪

用padding=wrap快速实现裁剪
EN

Stack Overflow用户
提问于 2016-07-08 12:53:51
回答 1查看 2.5K关注 0票数 1

我有一个非常长的循环,我在不同的位置裁剪图像,有一个固定大小的平方窗口,以获得numpy数组。

我正在使用来自crop图像库的PIL。然后,我将其转换为带有numpynp.asarray数组。

代码语言:javascript
复制
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文档中一样。

我的解决办法就是做这样的事。

代码语言:javascript
复制
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]

我想知道是否有一种更有效的方法来做到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-08 15:20:20

您可以使用numpy.take对边缘进行包装,例如,使用3x3裁剪窗口:

代码语言:javascript
复制
a = numpy.arange(100).reshape((10,10))
a.take([8,9,10], mode="wrap", axis=1).take([9,10,11], mode="wrap", axis=0)

它还接受索引列表,例如两个裁剪窗口:

代码语言:javascript
复制
b = a.take([[8,9,10],[3,4,5]], mode="wrap", axis=1).take([[9,10,11],[9,10,11]], mode="wrap", axis=0)

然后,您可以恢复已裁剪的窗口:

代码语言:javascript
复制
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]])

对于小窗口,这样做可能是有效的,但是对于较大的窗口,您可能希望在一个循环中一次指定一组索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38267221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档