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
相关产品推荐
相关产品推荐

