Python无第三方库提取PPM文件RGB值生成独立矩阵运行结果异常求助
代码问题排查及修正
- 类型匹配错误:调用
split()拆分得到的y是字符串类型,原代码直接和整数0、1、2做等值判断,条件永远不成立,所以三个通道的列表都是空值,对应输出的三个空矩阵。 - 通道提取逻辑完全错误:PPM P3格式的像素存储规则是所有像素值按
R值、G值、B值的顺序连续排列,每三个值对应一个像素的三个通道,不是「值等于0就属于R通道、等于1属于G通道、等于2属于B通道」,原代码的判断逻辑不符合PPM格式规范。 - 控制逻辑错误:
tmp变量的逻辑是仅读取第一行像素的时候才写入列表,读取完第一行就把tmp设为True,后续行的所有像素都会被丢弃。 - 返回值顺序错误:函数定义的返回顺序是
matrixR、matrixB、matrixG,G和B通道顺序颠倒,不符合预期的返回顺序。
修正后可运行代码
def createMatrixRGB(file_obj, width, height): matrixR = [[0 for _ in range(width)] for _ in range(height)] matrixG = [[0 for _ in range(width)] for _ in range(height)] matrixB = [[0 for _ in range(width)] for _ in range(height)] # 读取所有像素值并转成整数 all_pixels = [] for line in file_obj: line = line.strip() # 跳过空行和注释行 if line.startswith('#') or not line: continue all_pixels.extend(list(map(int, line.split()))) # 按R-G-B三个一组拆分填充矩阵 pixel_idx = 0 for h in range(height): for w in range(width): matrixR[h][w] = all_pixels[pixel_idx] matrixG[h][w] = all_pixels[pixel_idx+1] matrixB[h][w] = all_pixels[pixel_idx+2] pixel_idx += 3 return matrixR, matrixG, matrixB # 主逻辑 if __name__ == "__main__": feep_file = open("feep.ascii.ppm", "r") # 读取头信息,跳过中间可能存在的注释行 def read_non_comment_line(f): while True: line = f.readline() if not line: break line = line.strip() if line.startswith('#') or not line: continue return line magic_number = read_non_comment_line(feep_file) print(magic_number) dimension = read_non_comment_line(feep_file).split() width, height = int(dimension[0]), int(dimension[1]) max_val = read_non_comment_line(feep_file) # 提取三个通道 ppm_matrix = createMatrixRGB(feep_file, width, height) feep_file.close() # 输出验证 print("R通道矩阵尺寸:", len(ppm_matrix[0]), "行", len(ppm_matrix[0][0]), "列") print("G通道矩阵尺寸:", len(ppm_matrix[1]), "行", len(ppm_matrix[1][0]), "列") print("B通道矩阵尺寸:", len(ppm_matrix[2]), "行", len(ppm_matrix[2][0]), "列")
代码兼容含注释行的标准PPM P3格式,三个输出矩阵的坐标位置和原图像素位置一一对应。
内容的提问来源于stack exchange,提问作者Alpha24
相关产品推荐
相关产品推荐

