鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 3

[已解决]代码报错,请帮忙找出错误原因,并改正

[复制链接]
发表于 2023-8-7 16:33:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码:
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[y:y+image.shape[0], x:x+image.shape[1]] = 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[y:y+image.shape[0], x:x+image.shape[1]] = image
ValueError: could not broadcast input array from shape (17,100) into shape (0,100)
最佳答案
2023-8-7 16:33:49
错误原因是在合并图像时,尝试将图像数组赋值给merged_image数组的特定区域时出错。具体地说,错误发生在以下代码行:

merged_image[y:y+image.shape[0], x:x+image.shape[1]] = 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[y:y+image.shape[0], x:x+image.shape[1]] = image
    return merged_image

现在,通过在计算rows时使用np.ceil(np.sqrt(num_blocks)),我们确保了merged_image数组的形状足够容纳所有图像。这样,就能够正确地将图像赋值给合并图像的特定区域,避免了报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-7 16:33:48 | 显示全部楼层
根据报错信息和代码分析,出现错误的原因是在计算索引时,y:y+image.shape[0] 的值为0。这导致无法正确赋值给 merged_image

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

以下是修改后的代码:
import cv2import numpy as npdef 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[y:y+image.shape[0], x:x+image.shape[1]] = 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。如果仍然遇到问题,请提供输出的结果以便进一步排查。

如果回答对你有帮助,请给我一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[y:y+block_size, x:x+block_size] = image

    return merged_image

这样就可以修复代码中的错误。希望对你有帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-7 16:33:49 | 显示全部楼层    本楼为最佳答案   
错误原因是在合并图像时,尝试将图像数组赋值给merged_image数组的特定区域时出错。具体地说,错误发生在以下代码行:

merged_image[y:y+image.shape[0], x:x+image.shape[1]] = 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[y:y+image.shape[0], x:x+image.shape[1]] = image
    return merged_image

现在,通过在计算rows时使用np.ceil(np.sqrt(num_blocks)),我们确保了merged_image数组的形状足够容纳所有图像。这样,就能够正确地将图像赋值给合并图像的特定区域,避免了报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表