Предположим, у меня есть два массива изображений a
и b
одинаковых размеров, 8-битный цвет, формат RGB. Теперь предположим, что я хочу создать новый массив NumPy, чьи значения пикселей совпадают со значениями двух предыдущих в сочетании с использованием режима наложения «Наложение».
Его определение, взятое из Википедии, выглядит следующим образом, где b
- верхний слой, а a
- нижний слой:
![enter image description here](https://i.imgur.com/nCIh43A.png)
В формуле я считаю, что a
и b
представлены в терминах их "белизны" в том смысле, что полностью белый пиксель равен 1, а полностью черный пиксель равен 0. Я не уверен, как играет оттенок в это.
Я не уверен, есть ли более быстрый способ сделать это, кроме как перебирать два изображения попиксельно, что ДЕЙСТВИТЕЛЬНО медленно для изображений 1920x1080. Мне нужно быть в состоянии сделать это как можно быстрее.
Например, мне удалось реализовать режим смешивания Addition следующим образом:
import numpy as np
import cv2
a = cv2.imread("a.jpg", cv2.IMREAD_UNCHANGED)
b = cv2.imread("b.jpg", cv2.IMREAD_UNCHANGED)
a = a.astype(float)
b = b.astype(float)
ab = a
for i in range(len(ab)):
ab[i] = a[i] + b[i]
cv2.imwrite('Out.png', ab)
Кажется, что это довольно быстро, и, конечно, гораздо быстрее, чем пытаться достичь того же, перебирая пиксель за пикселем. Но еще раз, это всего лишь режим наложения Addition, и мне нужен режим наложения Overlay.
Если вам известна какая-либо реализация Python режима наложения Overlay между двумя RGB-изображениями в форме очень маленьких массивов, который очень эффективен, пожалуйста, помогите мне найти его. Если нет, можете ли вы реализовать его максимально эффективно?