Justheartyoung 发表于 2023-8-7 16:33:30

代码报错,请帮忙找出错误原因,并改正

代码:
def merge_images(images, block_size):
    num_blocks = len(images)
    rows = int(np.sqrt(num_blocks))
    cols = rows
    merged_image = np.zeros((rows * block_size, cols * block_size), dtype=np.uint8)
    for i, image in enumerate(images):
      x = (i % cols) * block_size
      y = (i // cols) * block_size
      merged_image, x:x+image.shape] = image
    return merged_image
报错:
File "C:\Users\WINDOWS\Desktop\taiyuan\python\segement.py", line 66, in <module>
    merged_image = merge_images(denoised_images, block_size)
File "C:\Users\WINDOWS\Desktop\taiyuan\python\segement.py", line 39, in merge_images
    merged_image, x:x+image.shape] = image
ValueError: could not broadcast input array from shape (17,100) into shape (0,100)

学习编程中的Ben 发表于 2023-8-7 16:33:48

根据报错信息和代码分析,出现错误的原因是在计算索引时,y:y+image.shape 的值为0。这导致无法正确赋值给 merged_image。

为了解决这个问题,我们可以检查计算索引时的值,并确保计算结果不为0。你可以使用 print 语句输出变量的值来进行调试。

以下是修改后的代码:

import cv2
import numpy as np

def merge_images(images, block_size):
    num_blocks = len(images)
    rows = int(np.sqrt(num_blocks))
    cols = rows
    merged_image = np.zeros((rows * block_size, cols * block_size), dtype=np.uint8)
    for i, image in enumerate(images):
      x = (i % cols) * block_size
      y = (i // cols) * block_size
      print(f"Image index: {i} | x: {x}, y: {y} | Shape: {image.shape}")
      merged_image, x:x+image.shape] = image
    return merged_image

# 示例代码
image_path = r"C:\Users\WINDOWS\Desktop\taiyuan\python\dune\dune.tif"
block_size = 100

# 读取遥感影像
image = cv2.imread(image_path)

# 其他步骤省略...

# 5. 将各个图幅合并为一个图幅
merged_image = merge_images(denoised_images, block_size)

# 导出结果
export_result(merged_image, "output.jpg")


通过添加了 print 语句,你可以在运行代码时查看输出的结果。检查输出的索引和形状值是否正确并且不为0。如果仍然遇到问题,请提供输出的结果以便进一步排查。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-7 16:33:49

根据报错信息,错误发生在 merge_images 函数的第一行,具体是在对 merged_image 进行赋值时出现问题。错误的原因是 merged_image 的形状(shape)计算不正确。

要修复这个错误,你可以先检查一下 num_blocks 的值是否为整数平方,并且确保输入的图像块尺寸和数量能够正确地合并。在当前代码中,由于 rows 取整操作可能导致 merged_image 的大小与实际图像尺寸不匹配,进而导致赋值操作失败。

你可以尝试使用以下修改后的代码:

def merge_images(images, block_size):
    num_blocks = len(images)
    rows = int(np.sqrt(num_blocks))
    cols = (num_blocks + rows - 1) // rows# 修改此处

    # 计算合并后图像的尺寸
    merged_height = rows * block_size
    merged_width = cols * block_size

    # 创建合并后的图像数组
    merged_image = np.zeros((merged_height, merged_width), dtype=np.uint8)

    for i, image in enumerate(images):
      x = (i % cols) * block_size
      y = (i // cols) * block_size

      # 将图像赋值到合并后的图像数组中
      merged_image = image

    return merged_image


这样就可以修复代码中的错误。希望对你有帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-8-7 16:33:49

错误原因是在合并图像时,尝试将图像数组赋值给merged_image数组的特定区域时出错。具体地说,错误发生在以下代码行:

merged_image, x:x+image.shape] = image

错误信息指出无法将形状为(17,100)的输入数组广播到形状为(0,100)的数组中。

这个错误的原因是merged_image数组的初始值为全零数组,其形状为(rows * block_size, cols * block_size)。然而,在循环中,计算出的y和x的值可能会导致merged_image的切片区域的形状为(0,100),这是因为image的形状可能大于block_size。

为了解决这个问题,我们可以在创建merged_image数组之前,根据图像数量和block_size计算出rows和cols的值,并确保merged_image数组的形状足够容纳所有图像。修改后的代码如下:

import numpy as np

def merge_images(images, block_size):
    num_blocks = len(images)
    rows = int(np.ceil(np.sqrt(num_blocks)))# 向上取整
    cols = rows
    merged_image = np.zeros((rows * block_size, cols * block_size), dtype=np.uint8)
    for i, image in enumerate(images):
      x = (i % cols) * block_size
      y = (i // cols) * block_size
      merged_image, x:x+image.shape] = image
    return merged_image

现在,通过在计算rows时使用np.ceil(np.sqrt(num_blocks)),我们确保了merged_image数组的形状足够容纳所有图像。这样,就能够正确地将图像赋值给合并图像的特定区域,避免了报错。
页: [1]
查看完整版本: 代码报错,请帮忙找出错误原因,并改正