Search code examples
pythonnumpypytorchtorch

Creating new channels from nearby pixels in pytorch


Given a batch image tensor like B x C x W x H (batchSize,channels,width,height),

I would like to create a new tensor in which the new channels are the channels from nearby pixels (padded with 0s).

For instance, if I choose the nearby pixel size to be 3 x 3 (like a 3 x 3 filter) then there are 9 total nearby pixels and the final tensor size would be B x ( 9 * C ) x W x H.

Any recommendations on doing this, or do I just need to go the brute-force approach through iteration?


Solution

  • If you want to cut the edges short (img is your image tensor):

    from skimage.util import view_as_windows
    B,C,W,H = img.shape
    img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)
    

    And if you want to pad them with 0 instead:

    from skimage.util import view_as_windows
    img = np.pad(img,((0,0),(0,0),(1,1),(1,1)))
    B,C,W,H = img.shape
    img_ = view_as_windows(img,(1,1,3,3)).reshape(B,C,W-2,H-2,-1).transpose(0,1,4,2,3).reshape(B,C*9,W-2,H-2)