【问题标题】:Reshape 5-dimensional tiled image to 3-dimensional normal image将 5 维平铺图像重塑为 3 维正常图像
【发布时间】:2025-12-23 17:25:12
【问题描述】:

我正在创建一个程序,该程序使用平铺形状 (n, n, 3, l, l) 的 RGB 图像。 n 是图像每一侧的每个图块的数量,l 是每个图块的像素长度。我正在尝试将其重塑为 (3, l * n, l * n) 形状。一个例子是形状 (7, 7, 3, 224, 224) 到 (3, 224, 224)。

我想保留新矩阵中像素的位置,以便稍后可视化此图像。如果我从棋盘图案的图像开始(每个其他图块的所有像素值都设置为 1,请参见下面的示例),然后使用 .reshape((3, 224, 224)),结果如下:

棋盘格(想要的结果)

错误的重塑方式

我已经制作了这种合并图块的 for 循环方法,该方法有效,但速度很慢:

# l: the pixel length of each tile
img_reshaped = torch.zeros((3, 224, 224))
for i in range(len(img)):
    for j in range(len(img[i])):
        img_reshaped[:, i * l:(i + 1) * l, j * 32:(j + 1) * l] = noise[i, j]

我也尝试过使用 .fold(),但这仅适用于 3D 矩阵,不适用于 5D。

关于如何解决这个问题的任何提示?我觉得应该比较简单,只是现在想不通。

PS:我用来生成棋盘的代码:

noise = torch.zeros((7, 7, 3, 32, 32))

for i in range(len(noise)):
    for j in range(len(noise[i])):
        if (i % 2 == 0 and j % 2 != 0) or (i % 2 != 0 and j % 2 == 0):
            noise[i][j] = torch.ones((3, 32, 32))

【问题讨论】:

    标签: python pytorch python-imaging-library reshape


    【解决方案1】:

    我认为你需要在 reshape 之前转置:

    n,l=2,3
    arr=np.zeros((n,n,3,l,l))
    
    for i in range(n):
        for j in range(n):
            arr[i,j] = (i+j)%2
    
    out= arr.transpose(2,0,3,1,4).reshape(3,n*l,-1)
    

    输出:

    【讨论】:

      最近更新 更多