【问题标题】:Splitting nd-array to sub nd-array with overlapping将nd-array拆分为重叠的子nd-array
【发布时间】:2021-02-18 04:21:11
【问题描述】:

我有一个以 nd-array 表示的图像。假设它的形状是(256, 256, 3)

我希望将图像切成子数组,每个子数组的大小为 (128, 128, 3),步幅为 64。

我执行以下操作以获得所需的索引:

for x1, x2 in (zip(range(0, 257, 64), range(128, 257, 64))):
    for y1, y2 in (zip(range(0, 257, 64), range(128, 257, 64))):
        print("rows:",x1,x2,", columns:",y1,y2)

我得到以下要切片的索引:

rows: 0 128 , columns: 0 128
rows: 0 128 , columns: 64 192
rows: 0 128 , columns: 128 256
rows: 64 192 , columns: 0 128
rows: 64 192 , columns: 64 192
rows: 64 192 , columns: 128 256
rows: 128 256 , columns: 0 128
rows: 128 256 , columns: 64 192
rows: 128 256 , columns: 128 256

现在我可以对每个子数组进行切片并将其堆叠,此外,我希望在对每个子数组进行一些操作并取平均值之后再次堆叠切片。

我想知道是否有更聪明的方法可以将它用于多个步幅/图像大小。

【问题讨论】:

    标签: python numpy multidimensional-array slice


    【解决方案1】:

    你想要skimage.util.view_as_windows

    arr = np.random.rand(256, 256, 3)
    out = skimage.util.view_as_windows(arr, window_shape = (128, 128, 3), step = 64).squeeze()
    print(out.shape)
    Out[]: (3, 3, 128, 128, 3)
    

    这是您的(128, 128, 3) 图像补丁的(3, 3) 数组。

    您还可以使用我的自定义配方 here(承认已过时,因为 view_as_windows 是为 nD 实现的),如果您只有 numpy,这可能会有所帮助

    【讨论】:

    • 如果我以后想合并图像,有没有聪明的方法?
    • “组合”是什么意思?
    • 将每个数组覆盖到它所取的“正确”位置。有意义吗?
    • 并非如此。数据仍然处于“正确”位置,这只是原始数据的视图,而不是副本。但是将视图写入 one-way ticket to a race condition,而我的配方和 view_as_windows 都试图阻止这种情况。无论如何,一旦你知道你想用它做什么,你就可以发布另一个问题。
    猜你喜欢
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多