【问题标题】:How to reproduce merging multiple images by different dimensions如何重现合并不同尺寸的多个图像
【发布时间】:2023-03-06 14:06:01
【问题描述】:

我之前问了一个问题,将每 4 个 64x64 大小的图像合并为 128x128,我将答案编辑如下:

How to merge multiple images from CNN prediction into one image?

# Initializing counters
i = 0  # Old image number
j = 0  # New image number

# Pre-allocate new images array
pred_128 = np.zeros((32, 128, 128, 1))

# Loop over new images
while j < 32:
    pred_128 [j, :64, :64, 0] = pred_64[0+i, :, :, 0]  # Upper left
    pred_128 [j, 64:, :64, 0] = pred_64[2+i, :, :, 0]  # Lower left
    pred_128 [j, :64, 64:, 0] = pred_64[1+i, :, :, 0]  # Upper right
    pred_128 [j, 64:, 64:, 0] = pred_64[3+i, :, :, 0]  # Lower right

    # Add to counters
    i += 4
    j += 1 

我现在想重用此代码以从不同的图像大小生成(32, 128, 128, 1),并且: 1-(512, 32, 32, 1) 2-(2048, 16, 16, 1)

对于第一种情况(512, 32, 32, 1),我使用了以下代码并返回错误:

# Initializing counters
i = 0  # Old image number
j = 0  # New image number

# Pre-allocate new images array
pred_128 = np.zeros((32, 128, 128, 1))

# Loop over new images
while j < 32:
    pred_128 [j, :32, :32, 0] = pred_32[0+i, :, :, 0]  # Upper left
    pred_128 [j, 32:, :32, 0] = pred_32[2+i, :, :, 0]  # Lower left
    pred_128 [j, :32, 32:, 0] = pred_32[1+i, :, :, 0]  # Upper right
    pred_128 [j, 32:, 32:, 0] = pred_32[3+i, :, :, 0]  # Lower right

    # Add to counters
    i += 8
    j += 1



ValueError                                Traceback (most recent call last)
<ipython-input-48-b4a45801c652> in <module>()
      9 while j < 32:
     10     pred_128 [j, :32, :32, 0] = pred_32[0+i, :, :, 0]  # Upper left
---> 11     pred_128 [j, 32:, :32, 0] = pred_32[2+i, :, :, 0]  # Lower left
     12     pred_128 [j, :32, 32:, 0] = pred_32[1+i, :, :, 0]  # Upper right
     13     pred_128 [j, 32:, 32:, 0] = pred_32[3+i, :, :, 0]  # Lower right

ValueError: could not broadcast input array from shape (32,32) into shape (96,32)

任何人都可以帮助重现代码并解决两种不同情况的问题: 1-(512, 32, 32, 1) #merging every 16 images

2-(2048, 16, 16, 1) #merging every 64 images


使用建议的代码后出错:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-79-b71bf1e0ef80> in <module>()
     12 # Loop over new images
     13 for i in range(0, out_shape[0]):
---> 14     for x in range(0, out_shape[1]/dx):
     15         for y in range(0, out_shape[2]/dy):
     16             pred_128[i, 0+dx*x:dx*(x+1), 0+dy*y:dy*(y+1), 0] = pred_32[input_im_no, :, :, 0]

TypeError: 'float' object cannot be interpreted as an integer

-原始数据中每16个32x32图像的顺序

【问题讨论】:

  • 第二个案例的维度添加了一个编辑。

标签: arrays numpy multidimensional-array transpose


【解决方案1】:

您需要添加更多图块才能获得完整的图像。对于pred_32case,1 个输出图像需要 16 个输入图像,对于pred_16,1 个输出图像需要 64 个输入图像。在这种情况下,编写一个循环“移动”所需的输出图像并一次输入一个图像可能更容易。假设您的图像从左到右填充更大的图像,我认为以下代码可能会对您有所帮助:

# Pre-allocate new images array
out_shape = (32, 128, 128, 1))
pred_128 = np.zeros(out_shape)

# Input sizes
dx = 32  # 16 for the pred_16
dy = 32  # 16 for the pred_16

# Input images counter
input_im_no = 0

# Loop over new images
for i in range(0, out_shape[0]):
    for y in range(0, int(out_shape[1]/dy)):
        for x in range(0, int(out_shape[2]/dx)):
            pred_128[i, 0+dx*x:dx*(x+1), 0+dy*y:dy*(y+1), 0] = pred_32[input_im_no, :, :, 0]

            # Select next image
            input_im_no += 1

编辑:问题更新后的 x 和 y 顺序。

【讨论】:

  • @ Jan Willem,在问题中使用您的解决方案后,我添加了一个新错误。请看一看。
  • @Sam 我添加了类型转换。现在如何运行?
  • @Jan Willem,您的修订有助于运行代码,但我注意到 32x32 图像的顺序与原始数据不匹配。对不起,我应该早点检查一下。我在问题的原始数据中上传了每个 32x32 图像的顺序(这与 16x16 图像相同)。有什么方法可以编辑你的代码吗?
  • @Sam 一个简单的 x 和 y 交换就可以了。我将编辑我的答案!
猜你喜欢
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2020-08-15
  • 2019-01-11
  • 2019-08-23
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多