首页 > 解决方案 > 如何在 Python 中将图像划分为块、处理它们并将它们重新合并在一起?

问题描述

我想将我的图像分成 4x4 块,然后放大每个块,最后将它们合并在一起

我在 Stackoverflow 上咨询过各种方法,但他们没有提到如何将块合并在一起

在此处输入图像描述

标签: pythonimageimage-processingcv2

解决方案


这是我对这篇文章的回答的复制粘贴,并添加了如何重新组装图像:我会像在下面的代码中那样做。在我的示例中,我使用了来自 skimage.data 的部分图像来说明我的方法,并制作了不同的形状和大小,以使其看起来更漂亮。但是您可以通过调整这些参数来为您的 dta 做同样的事情。

from skimage import data
from matplotlib import pyplot as plt
import numpy as np

astronaut = data.astronaut()
coffee    = data.coffee()

arr = np.stack([coffee[:400, :400, :], astronaut[:400, :400, :]])
plt.imshow(arr[0])
plt.title('arr[0]')
plt.figure()
plt.imshow(arr[1])
plt.title('arr[1]')

arr_blocks = arr.reshape(arr.shape[0], 4, 100, 4, 100, 3, ).swapaxes(2, 3)
arr_blocks = arr_blocks.reshape(-1, 100, 100, 3)


for i, block in enumerate(arr_blocks):
    plt.figure(10+i//16, figsize = (10, 10))
    plt.subplot(4, 4, i%16+1)
    plt.imshow(block)
    plt.title(f'block {i}')

# batch_size = 9
# some_outputs_list = []
# for i in range(arr_blocks.shape[0]//batch_size + ((arr_blocks.shape[0]%batch_size) > 0)):
#     some_outputs_list.append(some_function(arr_blocks[i*batch_size:(i+1)*batch_size]))

输出:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

为了重新组装图像,我会这样做:

arr_blocks = arr_blocks.reshape(-1, 4, 4, 100, 100, 3).swapaxes(2, 3)
arr_blocks = arr_blocks.reshape(-1, 400, 400, 3)

for i, block in enumerate(arr_blocks):
    plt.figure()
    plt.imshow(block)
    plt.title('reconstruction {i}')

输出:

在此处输入图像描述


推荐阅读