用python读取pgm文件
我对阅读python中的pgm文件作为数字文件/矩阵感兴趣 现在我用用python读取pgm文件,python,file,file-read,pgm,Python,File,File Read,Pgm,我对阅读python中的pgm文件作为数字文件/矩阵感兴趣 现在我用 f = open('/home/matthew/NCM/mdb001.pgm', 'rb') 当我读到第一行时,它看起来和预期的一样 r.readline() 产生 'P5\n' 下一行就可以了 '1024 1024\n' 接下来呢 '255\n' 但后来我听到了一连串的胡言乱语。它看起来像是一些十六进制值与其他东西混合在一起 我不想以图像图片的形式查看该文件,我只想查看其格式。如图所示读取标题后,您得到了宽度(10
f = open('/home/matthew/NCM/mdb001.pgm', 'rb')
当我读到第一行时,它看起来和预期的一样
r.readline()
产生
'P5\n'
下一行就可以了
'1024 1024\n'
接下来呢
'255\n'
但后来我听到了一连串的胡言乱语。它看起来像是一些十六进制值与其他东西混合在一起
我不想以图像图片的形式查看该文件,我只想查看其格式。如图所示读取标题后,您得到了宽度(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
如果遇到这样的文件,
read\u pgm
会有噪音地失败;处理此类情况的代码留给读者作为练习。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)
def read_pgm(pgmf):
“”“将PGM中的整数光栅作为列表列表返回。”“”
header=pgmf.readline()
断言头[:2]==b'P5'
(宽度、高度)=[int(i)表示页眉中的i.split()[1:3]]
深度=int(header.split()[3])
断言您正在阅读的P5
样式的pgm文件,正如您链接到的文档所描述的那样。您看到的“乱七八糟”是以字节形式编码的像素数据,这些字节介于'\x00'
到maxval之间,显示为255(或'\xff
'`)。应该有1024×1024字节的“胡言乱语”表示图像数据。好吧,那么我如何将其显示为数字数据(可能用空格分隔)而不是十六进制值,等等?而且它似乎不仅仅是十六进制值,还有其他一些东西。像这样的:;;=>??A?@A@@@A?Bebacadahfeehfiffegkjlljlkjijfjfjfhhigiiiliklinrnstuy]lw
我还了解到,PIL似乎能很好地处理这种类型的图像文件读取。非常感谢你的时间和努力。
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)