栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在图像上找到3x3滑动窗口

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在图像上找到3x3滑动窗口

可以通过重塑和交换轴,然后在所有内核元素上重复这样来更快地完成操作,如下所示:

im = np.arange(81).reshape(9,9)print np.swapaxes(im.reshape(3,3,3,-1),1,2)

这为您提供了一个3 * 3的瓷砖阵列,这些瓷砖在整个表面上进行镶嵌处理:

[[[[ 0  1  2]   [[ 3  4  5]   [[ 6  7  8]   [ 9 10 11]    [12 13 14]    [15 16 17]   [18 19 20]]   [21 22 23]]   [24 25 26]]] [[[27 28 29]   [[30 31 32]   [[33 34 35]   [36 37 38]    [39 40 41]    [42 43 44]   [45 46 47]]   [48 49 50]]   [51 52 53]]] [[[54 55 56]   [[57 58 59]   [[60 61 62]   [63 64 65]    [66 67 68]    [69 70 71]   [72 73 74]]   [75 76 77]]   [78 79 80]]]]

要使用的组合得到重叠的瓷砖,我们需要重复这个8进一步倍,但“包装”的阵列,

vstack
column_stack
。请注意,右侧和底部的图块数组会环绕(可能不是您想要的,取决于您如何处理边缘条件):

im =  np.vstack((im[1:],im[0]))im =  np.column_stack((im[:,1:],im[:,0]))print np.swapaxes(im.reshape(3,3,3,-1),1,2)#Output:[[[[10 11 12]   [[13 14 15]   [[16 17  9]   [19 20 21]    [22 23 24]    [25 26 18]   [28 29 30]]   [31 32 33]]   [34 35 27]]] [[[37 38 39]   [[40 41 42]   [[43 44 36]   [46 47 48]    [49 50 51]    [52 53 45]   [55 56 57]]   [58 59 60]]   [61 62 54]]] [[[64 65 66]   [[67 68 69]   [[70 71 63]   [73 74 75]    [76 77 78]    [79 80 72]   [ 1  2  3]]   [ 4  5  6]]   [ 7  8  0]]]]

这样,您将获得9组数组,因此需要将它们压缩在一起。这以及所有重塑都适用于此(对于尺寸可被3整除的数组):

def new(im):    rows,cols = im.shape    final = np.zeros((rows, cols, 3, 3))    for x in (0,1,2):        for y in (0,1,2): im1 = np.vstack((im[x:],im[:x])) im1 = np.column_stack((im1[:,y:],im1[:,:y])) final[x::3,y::3] = np.swapaxes(im1.reshape(rows/3,3,cols/3,-1),1,2)    return final

比较此

new
功能与使用循环遍历所有切片(下图)(
timeit
对于300 * 300阵列而言,快约4倍)。

def old(im):    rows,cols = im.shape    s = []    for x in xrange(1,rows):        for y in xrange(1,cols): s.append(im[x-1:x+2,y-1:y+2])    return s


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633961.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号