首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中读取pgm文件

在python中读取pgm文件
EN

Stack Overflow用户
提问于 2016-03-01 21:10:32
回答 3查看 22.1K关注 0票数 9

我对将python中的pgm文件作为数字文件/矩阵读取很感兴趣。

现在,我用以下命令打开文件

代码语言:javascript
复制
f = open('/home/matthew/NCM/mdb001.pgm', 'rb')

当我读到第一行时,它看起来和预期的一样

代码语言:javascript
复制
r.readline()

产生

代码语言:javascript
复制
'P5\n'

下一行就可以了

代码语言:javascript
复制
'1024 1024\n'

下一步

代码语言:javascript
复制
'255\n'

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-01 23:22:34

如您所示,在读取标题之后,您已经获得了宽度(1024)、高度(下一个1024)和深度(255)。要获取像素数据,最简单的方法是逐字节读取它们:

代码语言:javascript
复制
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文件的头信息在一行中是合法的,如下所示:

代码语言:javascript
复制
P5 1024 1024 15

如果您确实遇到了这样的文件,read_pgm将会完全失败;处理这种情况的代码将留给读者作为练习。

票数 10
EN

Stack Overflow用户

发布于 2020-03-13 00:04:59

msw的回答引导我编写了以下函数来读取具有他所描述的标题类型的16位.pmg图像:

代码语言:javascript
复制
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)

我希望这有助于澄清如何使用前面给出的答案

票数 5
EN

Stack Overflow用户

发布于 2021-11-21 03:34:10

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

下面的输出应该与@GodsFighter的答案相同。

代码语言:javascript
复制
import matplotlib.pyplot as plt
with open(f, 'rb') as pgmf:
    im = plt.imread(pgmf)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35723865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档