You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python图像解码代码运行报错IndexError:下标140超出size为140的轴0边界

报错原因与修复方案

你遇到的IndexError是因为初始化的original数组总长度为img_compressed[0] * img_compressed[1],数组下标从0开始,最大合法下标为总长度减1,当y + x = 140、数组总长度为140时,就触发了越界。

具体问题点

  • 函数内硬编码引用了外部变量img_compressed,没有使用传入的img参数,属于逻辑隐患
  • 游程解码逻辑没有做边界校验:累计写入的像素总数y超过原始图像总像素数后没有终止循环,就会触发数组越界
  • 奇偶校验的t变量计数逻辑冗余,完全可以跳过前两个字节(存储宽、高)直接遍历有效压缩数据,不需要额外判断i == 0 或 i == 1

修复后的代码

import matplotlib.pyplot as plt 
import numpy as np 

file_handle=open("compressed_image2.bin","rb")
img_compressed=np.fromfile(file_handle,dtype='uint8')
file_handle.close()

def decodeImage(img):
    # 前两个字节分别是宽、高,计算总像素数
    width = img[0]
    height = img[1]
    total_pixel = width * height
    original = np.zeros(total_pixel, dtype = "uint8")

    y = 0
    # 直接从第三个字节开始遍历压缩数据
    i = 2
    while i < len(img) - 1:
        count = img[i]
        pixel_val = img[i+1]
        # 边界校验:如果剩下的像素不够写count个,就只写到总像素数为止
        write_count = min(count, total_pixel - y)
        original[y:y+write_count] = pixel_val
        y += write_count
        # 写完就终止循环,避免越界
        if y >= total_pixel:
            break
        i += 2
    return original  

original=decodeImage(img_compressed)
        
C = len(original)/len(img_compressed)
R = 1 - 1/C
print("\n 压缩率 C=",C)
print("\n 冗余度 R = ",R)
original = np.reshape(original, [img_compressed[1], img_compressed[0]])
plt.imshow(original, cmap = "gray")
plt.show()

额外说明

原报错的本质是压缩数据的累计游程总长度超过了前两个字节标注的图像总像素数,增加边界校验后即可解决越界问题。

内容的提问来源于stack exchange,提问作者Alaa Mousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:24:00