修改 实际上,我需要一种方法来读取线条并将像素信息提取到某个结构中,这样我就可以使用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
答案 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
。
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
所以你可以看到你已经正确地重写了你的 PPM 文件(因为彩色图像中的每个像素都考虑了 RGB 三元组)
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)
虽然文档说明我们可以使用?直接打开.ppm
文件:
from PIL import Image
img = Image.open("path_to_file")
然而,当我们进一步检查时,我们可以看到它们只支持二进制版本(否则称为 P6 的 PPM)? 而不是 ASCII 版本(否则称为 P3 的 PPM)?。
因此,对于您的用例,使用 PIL 不是理想的选择❌。
使用 matplotlib.pyplot.imshow()
进行可视化的好处? 如上所述。