2

编辑: 实际上,我需要一种方法来读取行并将像素信息提取到某种结构中,这样我就可以使用 putpixel 函数基于 ppm p3 文件创建图像。

我已经尝试了很长时间,但我无法做到正确。

我正在使用 Python Imaging Library (PIL),我想打开一个 PPM 图像并将其显示为屏幕上的图像。

我怎样才能只使用 PIL 来做到这一点?

这是我的 ppm 图像。这只是我创建的 7x1 图像。

P3
# size 7x1
7 1
255
0
0
0
201
24
24
24
201
45
24
54
201
201
24
182
24
201
178
104
59
14
4

6 回答 6

6

如果您喜欢使用np.array对象,请执行以下操作:

>>> from scipy.misc import imread
>>> img = imread(path_to_ppm_file)
>>> img.shape
>>> (234, 555, 3)
于 2012-06-22T19:50:43.997 回答
3

阅读教程:http ://effbot.org/imagingbook/introduction.htm

第一个例子

>>> import Image
>>> im = Image.open("lena.ppm")
>>> im.show()
于 2010-11-04T21:40:35.267 回答
2

编辑:更多的信息有很长的路要走。现在我看到了您尝试打开的图像以及确切的错误消息,我记得关于 PIL 和 PPM 的一个很少记录的事实 - PIL 不支持以 P1/P2/P3 开头的 ASCII 版本,只支持二进制版本 P4/P5/P6。PS您的文件中缺少一个字段,255宽度和高度之后应该有一个最大像素值。


PPM 被列为受支持的格式,您应该能够使用Image.open('myfile.ppm').

显示图像需要更多信息。您使用的是什么操作系统,您是否对想要使用的窗口功能有偏好?

于 2010-11-04T21:39:40.077 回答
2

编辑:修改问题并且只允许阅读这些行后,请检查下面的链接。它解释了如何编写加载文件的包装器。我将自己测试这个,它应该可以工作......


您目前 (11/2010) 无法使用 PIL 打开纯 PPM 图像。这里的平原是指ASCII。但是二进制版本可以工作。主要原因是 ascii 文件的每像素位数不是恒定的。这就是 PIL 中的图像加载器所假设的。我有一个相关的问题:

如何为纯 pgm 格式编写 PIL 图像过滤器?

我打算为普通的 PPM 编写一个 PIL 过滤器,但我的时间很短。如果您有兴趣提供帮助,请告诉我。

兄弟,
朱哈

于 2010-11-28T21:22:13.610 回答
2

使用您的确切示例的一些背景概念:

  • .ppm是存储图像数据的文件格式之一,以便更易于阅读。

  • 它代表 Portable PixMap 格式

  • 这些文件通常具有以下格式:

# Optional Comments likes this one
# The first line is the image header which contains the format followed by width and height
P3 7 1
# Second line contains the maximum value possible for each color point
255
# Third line onwards, it contains the pixels represented in rows(7) and columns(1)
0 0 0
201 24 24 
24 201 45 
24 54 201
201 24 182 
24 201 178 
104 59 14

参考

所以你可以看到你已经正确地重写了你的 PPM 文件(因为彩色图像中的每个像素都考虑了 RGB 三元组)

打开和可视化文件

OpenCV(做得很棒)

import cv2
import matplotlib.pyplot as plt
img = cv2.imread("\path to the image")
# Remember, opencv by default reads images in BGR rather than RGB
# So we fix that by the following
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# Now, for small images like yours or any similar ones we use for example purpose to understand image processing operations or computer graphics
# Using opencv's cv2.imshow()
# Or google.colab.patches.cv2_imshow() [in case we are on Google Colab]
# Would not be of much use as the output would be very small to visualize
# Instead using matplotlib.pyplot.imshow() would give a decent visualization
plt.imshow(img)

枕头(或者我们称之为 PIL)

尽管文档声明我们可以.ppm使用以下方法直接打开文件:

from PIL import Image
img = Image.open("path_to_file")

参考

但是,当我们进一步检查时,我们可以看到它们仅支持二进制版本(对于 PPM 也称为 P6),而不支持 ASCII 版本(对于 PPM 也称为 P3)。

参考

因此,对于您的用例,使用 PIL 不是一个理想的选择❌。

使用可视化的好处matplotlib.pyplot.imshow()应如上所示。

于 2021-02-03T23:51:16.963 回答
1

im = Image.open("lena.ppm")

这似乎不适用于 P3 *.PPM,如果您尝试 P6 则可以。

于 2010-11-07T13:17:29.560 回答