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.