es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Establecer un elemento como arreglo numpy con numba no se ejecuta y no genera ninguna excepción.

Cuando busco una solución de por qué el código de abajo no se ejecuta, siempre llego a la conclusión de que debería funcionar correctamente.

Básicamente estoy tratando de acelerar el proceso de pintado de imágenes RGB usando numba. Entiendo que el problema está en establecer el elemento en el array brushOverlay porque si simplemente obtengo el elemento e imprimo, funciona perfectamente. Pensé que podría ser un problema de tipo estático, pero todos los arrays tienen tipo float64. ¿Qué me estoy perdiendo? ¡Gracias!

from numba import jit
import numpy as np
import matplotlib.pyplot as plt

@jit
def numba_overlay_brush(mask, imgRGB, brushColor):
    brushOverlay = imgRGB.copy()
    yy, xx = np.nonzero(mask)
    for i in range(len(yy)):
        for j in range(len(xx)):
            for c in range(3):
                brushOverlay[i, j, c] = brushColor[c]
    return brushOverlay

<h1>Imagen RGB aleatoria con valores float de 0 a 1</h1>

imgRGB = np.random.randint(0, 255, size=(1024, 1024, 3))
imgRGB = imgRGB/255

<h1>Máscara booleana donde pintar la imagen RGB de rojo</h1>

mask = np.zeros((1024, 1024), bool)
y_center = int(1024/2)
mask[y_center:y_center+2] = True

<h1>Color rojo</h1>

brushColor = np.array([1.0, 0.0, 0.0])

brushOverlay = numba_overlay_brush(mask, imgRGB, brushColor)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Es posible que el problema radique en el hecho de que los índices de bucle i y j se utilizan para indexar en el array brushOverlay, que tiene una forma diferente de los arrays yy y xx obtenidos de np.nonzero(mask). Para resolver este problema, los índices de bucle deben basarse en los valores de índice obtenidos de yy y xx, como se muestra a continuación:

    for k in range(len(yy)):
        i, j = yy[k], xx[k]
        for c in range(3):
            brushOverlay[i, j, c] = brushColor[c]
    

    Esto garantiza que el array brushOverlay se está accediendo correctamente y debería resolver el problema de que el código no se ejecute correctamente.

Comments are closed.