在Python中从离散像素值绘制图像的最快方法是什么?

saf*_*fsd 36 python image python-imaging-library

我希望基于计算的像素值绘制图像,作为可视化某些数据的手段.基本上,我希望采用二维矩阵颜色三元组并渲染它.

请注意,这不是图像处理,因为我没有变换现有图像,也没有进行任何形式的全图像变换,而且它也不是矢量图形,因为我正在渲染的图像没有预先确定的结构 - 我可能会一次生成一个像素的无定形色块.

我现在需要渲染大约1kx1k像素的图像,但是可扩展的东西会很有用.最终目标格式是PNG或任何其他无损格式.

我一直在通过ImageDraw的draw.point使用PIL,我想知道,鉴于我需要的非常具体和相对基本的功能,是否有更快的库可用?

小智 35

如果你有numpy和scipy可用(如果你在Python中操作大型数组,我会推荐它们),那么scipy.misc.pilutil.toimage函数非常方便.一个简单的例子:

import numpy as np
import scipy.misc as smp

# Create a 1024x1024x3 array of 8 bit unsigned integers
data = np.zeros( (1024,1024,3), dtype=np.uint8 )

data[512,512] = [254,0,0]       # Makes the middle pixel red
data[512,513] = [0,0,255]       # Makes the next pixel blue

img = smp.toimage( data )       # Create a PIL image
img.show()                      # View in default viewer
Run Code Online (Sandbox Code Playgroud)

好处是可以很好地处理不同数据类型,因此浮点数的二维数组可以合理地转换为灰度等.

您可以从http://docs.scipy.org/doc/scipy/reference/misc.html下载numpy和scipy .

  • "module 'scipy.misc' has no attribute 'toimage'" 直接使用 Pillow 的 Image.fromarray 代替。([来源](https://docs.scipy.org/doc/scipy-1.1.0/reference/ generated/scipy.misc.toimage.html#scipy.misc.toimage)) (7认同)
  • 如果您是在科学背景下执行此操作,您还可以使用 matplotlib.pyplot 的“imshow”。它以颜色图和插值方法为参数,对我很有帮助。 (2认同)
  • 现在不建议使用toimage:https://docs.scipy.org/doc/scipy/reference/generation/scipy.misc.toimage.html#scipy.misc.toimage (2认同)

bob*_*nce 18

import Image
im= Image.new('RGB', (1024, 1024))
im.putdata([(255,0,0), (0,255,0), (0,0,255)])
im.save('test.png')
Run Code Online (Sandbox Code Playgroud)

在图像的左上角放置一个红色,绿色和蓝色像素.

im.fromstring() 如果您更喜欢处理字节值,则更快.

  • 2017年,第一行是:来自PIL import Image (8认同)

oro*_*aki 5

要求

对于此示例,安装NumpyPillow

目标是首先将要创建的图像表示为一组由3个(RGB)数字组成的数组-使用Numpy array()可以提高性能和简便性:

import numpy

data = numpy.zeros((1024, 1024, 3), dtype=numpy.uint8)
Run Code Online (Sandbox Code Playgroud)

现在,将中间3个像素的RGB值设置为红色,绿色和蓝色:

data[512, 511] = [255, 0, 0]
data[512, 512] = [0, 255, 0]
data[512, 513] = [0, 0, 255]
Run Code Online (Sandbox Code Playgroud)

然后,使用枕头Image.fromarray()从阵列生成图像:

from PIL import Image

image = Image.fromarray(data)
Run Code Online (Sandbox Code Playgroud)

现在,“显示”图像(在OS X上,这将在“预览”中将其作为临时文件打开):

image.show()
Run Code Online (Sandbox Code Playgroud)

注意

此答案的灵感来自BADCODE的答案,该答案已经过时,无法使用,而且差异太大,无法简单地更新而无需完全重写。