【问题标题】:How to draw many semi-transparent figures in ImageDraw with good time performance?如何在 ImageDraw 中绘制许多具有良好时间性能的半透明图形?
【发布时间】:2020-03-26 18:18:21
【问题描述】:

我需要画很多相互重叠的半透明圆圈。问题是它应该工作得很快。我写了以下代码:

im = Image.new('RGBA', (512, 512), (255, 255, 255, 0))
for i in range(1000):
    im1 = Image.new("RGBA", (512, 512), (255, 255, 255, 0))
    draw = ImageDraw.Draw(im1)
    draw.ellipse(c[i].cv_repr(), fill=c[i].color)
    im = Image.alpha_composite(im1,im)

这段代码可以工作,但速度很慢。有没有不使用Image.alpha_composite 的方法来获得更好的性能?下图是预期的结果。

【问题讨论】:

  • 您可以通过每次迭代仅对图像的一个子部分(即每个椭圆的边界框)进行 alpha 合成来加速这个固有的缓慢过程。
  • 您还可以预先计算所有 1000 个中间椭圆图像,然后在循环中对它们进行 alpha 合成(尽管我怀疑后者是主要瓶颈)。

标签: python opencv python-imaging-library


【解决方案1】:

我在 OpenCV 库中找到了解决方案。

im = np.zeros([512,512,3],dtype=np.uint8)
im.fill(255)
for i in range(1000):
    im1 = im.copy()
    cv2.circle(im1, c[i].center, c[i].r, c[i].color, -1)
    im = cv2.addWeighted(im1, c[i].alpha, im, 1 - c[i].alpha, 0)

答案中代码(1000 圈)的平均经过时间是 ~4.16s VS ~302ms 在我的答案中。这是我想要的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 2012-01-16
    • 2021-04-10
    • 2016-05-25
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多