gpt4 book ai didi

python - 分割成 block 后如何合并图像

转载 作者:行者123 更新时间:2023-12-05 05:39:11 25 4
gpt4 key购买 nike

我用下面的代码把一张图片分成了 block

block = []
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[y:y+16, x:x+16])
np_block = np.array(block)

enter image description here

图像形状为224,224,3,每个 block 为16,16,3。如何将这些 block 组合在一起形成完整的图像?当我 reshape 它 (np_block.reshape(224, 224,3)) 时,我得到了下图,它与真实图像完全不同

enter image description here

编辑:这已在评论部分回答如下:

reshaped_img = np_block.reshape(14,14,16,16,3).transpose(0,3,1,2,4).reshape(14*16,14*16,3)

与原始图像相比,生成的图像进行了旋转和翻转。这是原图

original image

这是将 block 合并在一起的方法生成的图像

merged image

执行 restored_img = np.flip(np.rot90(reshaped_img, k=1, axes=(0, 1)), axis=0) 会正确地将生成的图像恢复为其原始形式.

但是,在pytorch中将restored_img转换为tensor,tensor_img = torch.from_numpy(restored_img)会抛出如下错误:

ValueError: At least one stride in the given numpy array is negative, and tensors with negative strides are not currently supported. (You can probably work around this by making a copy of your array  with array.copy().) 

我按照错误消息中的建议解决了这个问题。

tensor_img = torch.from_numpy(restored_img.copy()) 消除了错误,但未保留对 restored_img 进行的转换(旋转和翻转)。 tensor_img 仍然与上面最后一张图片相同。

我注意到在拆分原始图像时,拆分块没有以正确的顺序附加。当我可视化它时,这在 np_block 中很明显(上面的第一张图片看起来翻转和旋转)。因此,我将 block.append(im[y:y+16, x:x+16]) 行更改为 block.append(im[x:x+16, y: y+16])

重新可视化 np_block 因此得到以下图像

enter image description here

这看起来更接近原始图像,而且 block 看起来也以正确的顺序排列(这是我观察到的)。但是这些 block 彼此不重叠。

请问我该如何解决这个问题?

最佳答案

您好,最初提出的解决方案的问题是您必须重新排列 block 0,31,2 如果您交换这些维度,那么它就会得到解决.检查:

block = [] #create blocks
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[y:y+16, x:x+16])
np_block = np.array(block)

reshaped_img = np_block.reshape(14,14,16,16,3).transpose(1,2,0,3,4).reshape(14*16,14*16,3)
#check indices are now (1,2,0,3,4) instead of (0,3,1,2,4)

plt.imshow(np.hstack([im,reshaped_img]))

编辑

同样来自原始评论,这只是转置输出维度reshaped_img.transpose(1,0),但如果你能在原来的 reshape 中纠正它是一个更好的解决方案


编辑2

使用更正后的堆叠(x 在第一维)代码将是:

block = []
for x in range(0, 224,16):
for y in range(0, 224,16):
block.append(im[x:x+16, y:y+16])
np_block = np.array(block)

reshaped_img = np_block.reshape(14,14,16,16,3).transpose(0,2,1,3,4).reshape(14*16,14*16,3)

这里有莫尔斯意义: block 中 reshape 的第一个维度 (dim 0) 与子 block 的第一个维度 (dim 2) 被分组,然后 block 的第二个维度和子 block (1, 3).

在任何情况下,您都可以通过以下方式检查好的解决方案:

plt.imshow(np.hstack([im,reshaped_img]))

编辑 3最后一次编辑,这里是检查原始 block reshape 的代码(使用编辑 2 的代码)。在这里你可以看到每个 block 都有一些图像中的切割感:


b = np_block.reshape(14,14,16,16,3)
plt.figure()
for i in range(14):
for j in range(14):
plt.subplot(14,14,14*i+j+1)
plt.imshow(b[i,j])
plt.axis('off')

关于python - 分割成 block 后如何合并图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72764481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com