【问题标题】:Read a pgm file in python在python中读取一个pgm文件
【发布时间】:2016-06-13 22:15:19
【问题描述】:

我有兴趣在 python 中将 pgm 文件作为数字文件/矩阵读取

现在我用

打开文件
f = open('/home/matthew/NCM/mdb001.pgm', 'rb')

当我阅读第一行时,它看起来像预期的那样

r.readline()

生产

'P5\n'

下一行没问题

'1024 1024\n'

还有下一个

'255\n'

但是我得到了一系列的胡言乱语。看起来像一些十六进制值与其他东西混合在一起。

我不想以图像图片的形式查看文件,我只想以this 格式查看。

【问题讨论】:

  • 您正在阅读 P5 样式的 pgm 文件作为您链接到的文档描述。您看到的“乱码”是将像素数据编码为'\x00' 到 maxval 之间的字节,您显示为 255(或'\xff'`)。应该有 1024×1024 字节的“乱码”代表图像数据。
  • 好的,那么我怎样才能将其显示为数字数据(可能用空格分隔)而不是十六进制值等?
  • 而且它似乎不仅仅是十六进制值,还有其他一些东西。像这样:;;=><@>??A?@A@??@?A?BEBACADAHHFEEHHFIFFEGKJLLJLMJKKJIJJFJFHHIGIIIHIILIKLNRNNSTUY]lw

标签: python file file-read pgm


【解决方案1】:

按照您的说明阅读标题后,您将获得宽度 (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 会大声失败;处理这种情况的代码留给读者练习。

【讨论】:

  • 我还了解到 PIL 似乎可以很好地处理这种类型的图像文件读取。非常感谢您的时间和精力。
【解决方案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)

我希望这有助于阐明如何使用之前给出的答案

【讨论】:

    【解决方案3】:

    有趣的是,matplotlib 内置了这个功能。

    以下内容应该与@GodsFighter 的答案相同。

    import matplotlib.pyplot as plt
    with open(f, 'rb') as pgmf:
        im = plt.imread(pgmf)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      相关资源
      最近更新 更多