让我们从一个已知的示例图像开始。这里有一个小的3x2实际工作和一个更大的,你可以看到它:
小:
大:
您可以打开一个图像并将其变成一个高效、快速的numpy多维数组,如下所示:#!/usr/local/bin/python3
import numpy as np
from PIL import Image
# Open image from disk
im = Image.open('image.png')
na = np.array(im)
看起来像这样:
^{pr2}$
并将其转换回一个PIL图像并保存如下(只需将此代码附加到上面的代码中):# Convert array back to Image
resultim = Image.fromarray(na)
resultim.save('result.png')
一些注释:
注1
如果你想要一个RGB888图像,并且你正在打开一个PNG图像,你可能会得到一个没有每个像素的RGB值的调色板图像,而是每个像素都有一个调色板索引,一切都会出错!在
例如,下面是与上面相同的图像,但当生成应用程序将其保存为调色板图像时:array([[0, 1, 2],
[3, 4, 5]], dtype=uint8)
从im.getpalette()返回的内容:[255,
0,
0,
0,
255,
0,
0,
0,
255,
0,
0,
0,
255,
255,
255,
126,
126,
126,
...
...
所以,这个故事的寓意是。。。如果需要RGB888图像,请使用:Image.open('image.png').convert('RGB')
注2
同样,如果您打开一个包含透明度的PNG文件,它将有4个通道,最后一个通道是alpha/transparency,如果您想放弃alpha通道,应该调用convert('RGB')。在
注3
如果不需要中间图像,可以将加载和保存简化为单行:# Load and make array in one go
na = np.array(Image.open('image.png').convert('RGB'))
# Convert back to PIL Image and save in one go
Image.fromarray(na).save('result.png')
关键词:图像,图像处理,numpy,array,ndarray,PIL,pill,Python3,palete,PNG,JPG