从pytorch中的附近像素创建新通道

2024-09-30 18:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

给定批量图像张量,如B x C x W x H(批量大小、通道、宽度、高度)

我想创建一个新的张量,其中新通道是来自附近像素的通道(用0填充)

例如,如果我选择附近的像素大小为3x3(如3x3过滤器),那么附近总共有9个像素,最终的张量大小为bx(9*C)xwxh

对此有什么建议吗,还是我只需要通过迭代使用蛮力方法


Tags: 方法图像过滤器宽度高度像素批量建议
2条回答

如果要缩短边(img是图像张量):

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)

如果要将其填充为0,请执行以下操作:

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)

对于未来的读者,如果您不想破坏计算图(使用skimage),或者不想通过不将数据从GPU移动到GPU来使用更高效的实现,那么您可能需要一个本机PyTorch解决方案

这个问题非常接近逆PixelShuffle,并且有一个当前活动的feature request。不同之处在于,海报希望保持图像分辨率,而此解决方案不希望

我在这里复制请求者的初始代码(非常有效):

out_channel = c*(r**2)
out_h = h//r
out_w = w//r
fm_view = fm.contiguous().view(b, c, out_h, r, out_w, r)
fm_prime = fm_view.permute(0,1,3,5,2,4).contiguous().view(b,out_channel, out_h, out_w)

相关问题 更多 >