Как нарисовать много полупрозрачных фигур в ImageDraw с хорошей производительностью времени? - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно нарисовать много полупрозрачных кругов, которые перекрывают друг друга. Проблема в том, что он должен работать быстро. Я написал следующий код:

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 для лучшей производительности? Изображение ниже - ожидаемый результат. Expected result

1 Ответ

1 голос
/ 26 марта 2020

Я нашел решение в библиотеке 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,16 с против ~ 302 мс в моем ответе. Это спектакль, который я хотел получить.

...