使用 PIL 和 SKIMAGE 打开 PGM 文件时出错

Error Opening PGM file with PIL and SKIMAGE

我有以下图像文件:

Image

我使用 PIL 和 Skimage 打开它,但出现以下错误

首先使用 PIL(尝试使用和不使用 trucate 选项): 代码:

from PIL import Image, ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
img = Image.open("image_output.pgm")

错误:

OSError: cannot identify image file 'image_output.pgm'

并且使用 Skimage:

代码:

from skimage import io
img = io.imread("image_output.pgm")

错误:

OSError: cannot identify image file <_io.BufferedReader name='image_output.pgm'>

我可以使用系统照片查看器和 Matlab 等 GUI 应用程序打开文件。

如何诊断图像有什么问题?我将字节数据与我可以在 Python 中打开的其他 PGM 文件进行了比较,但无法识别差异。

谢谢。

您的文件是 P2 类型 PGM,这意味着它是 ASCII 格式的 - 您可以在普通文本编辑器中查看它。 PILskimage 似乎都不想读它,但很高兴读到相应的 P5 类型,除了它是相同的是用二进制而不是 ASCII 写的。

有几个选项...


1) 您可以使用 OpenCV 阅读它:

import cv2
im = cv2.imread('a.pgm')

2) 您可以使用 ImageMagick 将其转换为 P5,然后使用 skimage[=43= 读取 output.pgm 文件] 或 PIL:

magick input.pgm output.pgm

3) 如果添加 OpenCVImageMagick 作为依赖项对您来说真的很痛苦,那么 可能 自己阅读 PGM 图片:

#!/usr/bin/env python3

import re
import numpy as np

# Open image file, slurp the lot
with open('input.pgm') as f:
   s = f.read()

# Find anything that looks like numbers
# Technically, there could be comments that should be ignored
l=re.findall(r'[0-9P]+',s)

# List "l" will contain: P5, width, height, 255, pixel1, pixel2, pixel3...
# Technically, if l[3]>255, you should change the type of the Numpy array to uint16, but that is not the case
w, h = int(l[1]), int(l[2])

# Make Numpy image from data
ni = np.array(l[4:],dtype=np.uint8).reshape((h,w))