使用python和PIL模块导入PPM图像

时间:2010-11-04 21:27:32

标签: python image import python-imaging-library ppm

修改 实际上,我需要一种方法来读取线条并将像素信息提取到某个结构中,这样我就可以使用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

6 个答案:

答案 0 :(得分:5)

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

>>> from scipy.misc import imread
>>> img = imread(path_to_ppm_file)
>>> img.shape
>>> (234, 555, 3)

答案 1 :(得分:2)

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

<小时/> PPM is listed作为受支持的格式,您应该可以使用Image.open('myfile.ppm')打开文件。

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

答案 2 :(得分:2)

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

第一个例子

>>> import Image
>>> im = Image.open("lena.ppm")
>>> im.show()

答案 3 :(得分:1)

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

这似乎不适用于P3 * .PPM,如果您尝试使用P6,它会起作用。

答案 4 :(得分:1)

编辑:在您修改了问题后,只需阅读相关内容,请查看下面的链接。它解释了如何编写加载文件的包装器。我即将自己测试它,它应该工作......


您目前(2010年11月)无法使用PIL打开纯PPM图像。这里的平原意味着ascii。然而,二进制版本工作。主要原因是ascii文件每个像素没有恒定的位数。这就是PIL中的图像加载器所假设的。我有一个相关的问题:

How to write PIL image filter for plain pgm format?

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

BR,
尤哈

答案 5 :(得分:1)

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

  • .ppm 是存储图像数据的一种文件格式,因此它更具人类?可读性。

  • 它代表便携式像素图格式

  • 这些文件通常采用以下格式:

# 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

Reference

所以你可以看到你已经正确地重写了你的 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")

Reference

然而,当我们进一步检查时,我们可以看到它们只支持二进制版本(否则称为 P6 的 PPM)? 而不是 ASCII 版本(否则称为 P3 的 PPM)?。

Reference

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

使用 matplotlib.pyplot.imshow() 进行可视化的好处? 如上所述。