【问题标题】:How can I convert an array of pixel colors into an image efficiently with Python?如何使用 Python 有效地将像素颜色数组转换为图像?
【发布时间】:2023-03-15 21:32:01
【问题描述】:

我正在开发一个使用 Python 3.8 实现 Numba 和 CUDA 的项目。目前,我创建了一个具有最终图像尺寸的数组。接下来,我使用 CUDA 内核(非常快)生成图像。然后,我将像素颜色复制到枕头图像中(非常慢)。我的代码:

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

这种调整对代码的运行时间影响不大。我正在进一步研究从数组中加载图像而不是将每个像素放入图像中的建议。

【问题讨论】:

  • 这里有很多潜在的优化。可以做什么将取决于可以从rgb_conv 返回的内容。那是你自己的功能,对吧?如果是这样,我希望优化该功能的功能,希望不需要您在此处显示的所有后处理。如果这不是您的功能,那么提供一个明确定义生成的“颜色”可以包含的内容将非常有帮助。如果那是你的功能,你能告诉我们吗?
  • 如果图像最初在 GPU 上,那么在那里进行转换会很有意义。如果您将其复制到 GPU 进行转换,那么我不确定它是否会为您节省在 GPU 上执行的任何操作。 - 再次,源图像格式到底是什么?
  • 您不应该使用 PIL 放置单个像素。图片有 frombytesfrombuffer 方法,它们会快得多
  • 很高兴你能成功,欢迎来到 Stack Overflow!您的“编辑 2”信息最好放在下面的答案中,而不是问题中。

标签: python python-imaging-library numba


【解决方案1】:

使用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)

【讨论】:

    猜你喜欢
    • 2013-03-30
    • 1970-01-01
    • 2022-01-14
    • 2017-10-02
    • 2018-03-19
    • 1970-01-01
    • 2021-02-14
    • 2018-06-21
    • 2019-11-27
    相关资源
    最近更新 更多