使用 PIL 和 SKIMAGE 打开 PGM 文件时出错
Error Opening PGM file with PIL and SKIMAGE
我有以下图像文件:
我使用 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 格式的 - 您可以在普通文本编辑器中查看它。 PIL 和 skimage 似乎都不想读它,但很高兴读到相应的 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) 如果添加 OpenCV 或 ImageMagick 作为依赖项对您来说真的很痛苦,那么 可能 自己阅读 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))
我有以下图像文件:
我使用 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 格式的 - 您可以在普通文本编辑器中查看它。 PIL 和 skimage 似乎都不想读它,但很高兴读到相应的 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) 如果添加 OpenCV 或 ImageMagick 作为依赖项对您来说真的很痛苦,那么 可能 自己阅读 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))