Python, Numpy, OpenCV – Creando una función modificada (e igualmente rápida) “addWeighted”

Estoy trabajando en un progtwig en Python que hace uso de una función muy similar a la función addWeighted en openCV. La diferencia es que en realidad no agrega las matrices numpy que representan las imágenes, sino que toma el píxel más shiny en cualquier coordenada en particular y usa ese valor.

Lo que he encontrado, sin embargo, es que a pesar del hecho de que estas funciones hacen cosas muy similares, la función addWeighted es mucho más rápida. Entonces, mi pregunta es, ¿cómo puedo modificar mi solución actual para que sea igual de rápida? ¿Hay alguna forma de usar el módulo de multiprocessing o algo similar?

Aquí está el código:

 image = np.zeros(image_1.shape) for row_index, row in enumerate(image_1): for col_index, col in enumerate(row): pixel_1 = image_1[row_index, col_index] pixel_2 = image_2[row_index, col_index] sum_1 = int(pixel_1[0]) + int(pixel_1[1]) + int(pixel_1[2]) sum_2 = int(pixel_2[0]) + int(pixel_2[1]) + int(pixel_2[2]) if sum_2 > sum_1: image[row_index, col_index] = pixel_2 else: image[row_index, col_index] = pixel_1 

Donde image_1 y image_2 son matrices numpy que representan imágenes, ambas con la misma forma (720, 1280, 3) .

Un enfoque vectorizado sería –

 mask = image_2.astype(int).sum(-1) > image_1.astype(int).sum(-1) out = np.where(mask[...,None], image_2, image_1) 

Pasos

  • Convierta a tipos de datos int , sume a lo largo del último eje y realice comparaciones de elementos. Esto nos daría una máscara.

  • Use np.where con esta máscara, extendida al mismo no. de dims como matrices de entrada para hacer la elección. Esto emplea el concepto de NumPy broadcasting para hacer la elección de una manera vectorializada. Por lo tanto, vale la pena un buen vistazo.

Nota: Alternativamente, también podemos usar keepdims=True para mantener el no. de atenuaciones al sumr, evitando así extender las atenuaciones en el siguiente paso.