我有兴趣在python中读取pgm文件作为数字文件/矩阵
现在我用
打开文件f = open('/home/matthew/NCM/mdb001.pgm', 'rb')
当我读到第一行时,它看起来像预期的那样
r.readline()
产生
'P5\n'
,下一行很好
'1024 1024\n'
和下一个
'255\n'
然后我得到了一系列的胡言乱语。看起来有些十六进制值与其他内容混合在一起。
我不想将该文件视为图片图片,我只想以this格式查看。
答案 0 :(得分:5)
如您所示,在阅读了标题后,您已获得高度(1024)的高度(下一个1024)和深度(255)。要获取像素数据,最简单的是逐字节读取它们:
def read_pgm(pgmf):
"""Return a raster of integers from a PGM as a list of lists."""
assert pgmf.readline() == 'P5\n'
(width, height) = [int(i) for i in pgmf.readline().split()]
depth = int(pgmf.readline())
assert depth <= 255
raster = []
for y in range(height):
row = []
for y in range(width):
row.append(ord(pgmf.read(1)))
raster.append(row)
return raster
此代码仅适用于8位深度图像,这就是assert
语句存在的原因。
PGM文件在一行中包含标题信息是合法的,如下所示:
P5 1024 1024 15
如果您确实遇到这样的文件,read_pgm
将会失败;处理此类案件的代码留给读者练习。
答案 1 :(得分:2)
msw的答案引导我编写以下函数,以读取他描述的标头类型的16位.pmg图像:
def read_pgm(pgmf):
"""Return a raster of integers from a PGM as a list of lists."""
header = pgmf.readline()
assert header[:2] == b'P5'
(width, height) = [int(i) for i in header.split()[1:3]]
depth = int(header.split()[3])
assert depth <= 65535
raster = []
for y in range(height):
row = []
for y in range(width):
low_bits = ord(pgmf.read(1))
row.append(low_bits+255*ord(pgmf.read(1)))
raster.append(row)
return raster
f = open(pgm_path, 'rb')
im = read_pgm(f)
f.close()
im = np.array(im)
我希望这有助于阐明如何使用先前给出的答案