【发布时间】: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 放置单个像素。图片有
frombytes和frombuffer方法,它们会快得多。 -
很高兴你能成功,欢迎来到 Stack Overflow!您的“编辑 2”信息最好放在下面的答案中,而不是问题中。
标签: python python-imaging-library numba