如何使用 Python 有效地将像素颜色数组转换为图像?
How can I convert an array of pixel colors into an image efficiently with Python?
我正在开发一个使用 Python 3.8 实现 Numba 和 CUDA 的项目。目前,我创建了一个包含最终图像尺寸的数组。接下来,我生成一个带有 CUDA 内核的图像(速度非常快)。然后,我将像素颜色复制到 Pillow Image 中(非常慢)。我的代码:
for x in range(width):
for y in range(height):
if pixels[x][y] = 0:
color = [0, 0, 0]
else:
# Get color from int as tuple
color = rgb_conv(pixels[x][y]
red = int(numpy.floor(color[0]))
if red > 255:
red = 255
elif red < 0:
red = 0
green = int(numpy.floor(color[1]))
if green > 255:
green = 255
elif green < 0:
green = 0
blue = int(numpy.floor(color[2]))
if blue > 255:
blue = 255
elif blue < 0:
blue = 0
image.putpixel((x, y), (red, green, blue))
是否有更高效的 Python 图像库可用于此实现?有没有办法将数组转换为 GPU 上的图像?任何指导工作的帮助。谢谢!
编辑 1:请求函数 rgb_conv
。这是我发现的一个函数,可以将单个整数转换为三宽颜色。
def rgb_conv(i):
color = 255 * numpy.array(colorsys.hsv_to_rgb(i / 255.0, 1.0, 0.5))
return tuple(color.astype(int))
但是,我不是特别喜欢这个函数产生的颜色,所以我删除了它并开始使用以下函数:
pixelArr = image.load()
for x in range(width):
for y in range(height):
color = int(numpy.floor(pixels[x][y]))
pixelArr[x, y] = (color << 21) + (color << 10) + color * 8
此调整对代码的 运行 时间影响不大。我正在进一步研究从数组加载图像而不是将每个像素放入图像的建议。
使用 pillow
将每个像素放入图像中效率不高。从 numpy 数组创建图像比以前快得多。更快,我的意思是 3840x2160 图像需要几分钟,但现在需要 0.0117 秒。
要创建一个可以转换为图像的数组:
import numpy
pixels = numpy.zeros((height, width, 3), dtype=numpy.uint8)
在这里,我 运行 在 GPU 上计算以创建具有像素数组的图像。要有效地将像素数组转换为图像:
from PIL import Image
image = Image.fromarray(pixels)
我正在开发一个使用 Python 3.8 实现 Numba 和 CUDA 的项目。目前,我创建了一个包含最终图像尺寸的数组。接下来,我生成一个带有 CUDA 内核的图像(速度非常快)。然后,我将像素颜色复制到 Pillow Image 中(非常慢)。我的代码:
for x in range(width):
for y in range(height):
if pixels[x][y] = 0:
color = [0, 0, 0]
else:
# Get color from int as tuple
color = rgb_conv(pixels[x][y]
red = int(numpy.floor(color[0]))
if red > 255:
red = 255
elif red < 0:
red = 0
green = int(numpy.floor(color[1]))
if green > 255:
green = 255
elif green < 0:
green = 0
blue = int(numpy.floor(color[2]))
if blue > 255:
blue = 255
elif blue < 0:
blue = 0
image.putpixel((x, y), (red, green, blue))
是否有更高效的 Python 图像库可用于此实现?有没有办法将数组转换为 GPU 上的图像?任何指导工作的帮助。谢谢!
编辑 1:请求函数 rgb_conv
。这是我发现的一个函数,可以将单个整数转换为三宽颜色。
def rgb_conv(i):
color = 255 * numpy.array(colorsys.hsv_to_rgb(i / 255.0, 1.0, 0.5))
return tuple(color.astype(int))
但是,我不是特别喜欢这个函数产生的颜色,所以我删除了它并开始使用以下函数:
pixelArr = image.load()
for x in range(width):
for y in range(height):
color = int(numpy.floor(pixels[x][y]))
pixelArr[x, y] = (color << 21) + (color << 10) + color * 8
此调整对代码的 运行 时间影响不大。我正在进一步研究从数组加载图像而不是将每个像素放入图像的建议。
使用 pillow
将每个像素放入图像中效率不高。从 numpy 数组创建图像比以前快得多。更快,我的意思是 3840x2160 图像需要几分钟,但现在需要 0.0117 秒。
要创建一个可以转换为图像的数组:
import numpy
pixels = numpy.zeros((height, width, 3), dtype=numpy.uint8)
在这里,我 运行 在 GPU 上计算以创建具有像素数组的图像。要有效地将像素数组转换为图像:
from PIL import Image
image = Image.fromarray(pixels)