簡體   English   中英

從(圖像)數組中提取多個窗口/補丁,如另一個數組中所定義

[英]Extract multiple windows/patches from an (image) array, as defined in another array

我有一個圖像im ,這是一個由imread給出的imread 比如說

im = np.array([[1,2,3,4],
               [2,3,4,5],
               [3,4,5,6],
               [4,5,6,7]]

我有另一個(n,4) windows數組,其中每行定義圖像的補丁為(x, y, w, h) 例如

windows = np.array([[0,0,2,2],
                    [1,1,2,2]]

我想從im提取所有這些補丁作為子數組,而不需要循環。 我目前的循環解決方案是這樣的:

for x, y, w, h in windows:
    patch = im[y:(y+h),x:(x+w)]

但是如果可能的話,我想要一個很好的基於數組的操作來獲取所有這些操作。

謝謝。

對於相同的窗口大小,我們可以在scikit-image的view_as_windows幫助下獲得視圖,就像這樣 -

from skimage.util.shape import view_as_windows

im4D = view_as_windows(im, (windows[0,2],windows[0,3]))
out = im4D[windows[:,0], windows[:,1]]

樣品運行 -

In [191]: im4D = view_as_windows(im, (windows[0,2],windows[0,3]))

In [192]: im4D[windows[:,0], windows[:,1]]
Out[192]: 
array([[[1, 2],
        [2, 3]],

       [[3, 4],
        [4, 5]]])

如果scikit不可用,我們可以使用numpy.lib.stride_tricks自制numpy.lib.stride_tricks的解決方案。 適用相同的約束(所有窗口必須具有相同的形狀):

import numpy as np
from numpy.lib.stride_tricks import as_strided

im = np.array([[1,2,3,4],
               [2,3,4,5],
               [3,4,5,6],
               [4,5,6,7]])

windows = np.array([[0,0,2,2],
                    [1,1,2,2]])

Y, X = im.shape
y, x = windows[0, 2:]
cutmeup = as_strided(im, shape=(Y-y+1, X-x+1, y, x), strides=2*im.strides)
print(cutmeup[windows[:, 0], windows[:, 1]])

輸出:

[[[1 2]
  [2 3]]

 [[3 4]
  [4 5]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM