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.

Añadir ruido gaussiano a una imagen sin numpy.

Estoy tratando de agregar ruido gaussiano a una imagen usando Python. Estoy utilizando el siguiente código para definir mi función “Add Noise”. Hasta ahora, funciona bien pero tengo que hacerlo sin usar comandos predefinidos de numpy. Solo quiero usar cv2.

El código es el siguiente:

def add_noise(img):

mean = 0
var = 10
sigma = var ** 1.5
gaussian = np.random.normal(mean, sigma, (512,512)) 
#np.zeros((224, 224), np.float32

noisy_image = np.zeros(img.shape, np.float32)

if len(img.shape) == 2:
    noisy_image = img + gaussian
else:
    noisy_image[:, :, 0] = img[:, :, 0] + gaussian
    noisy_image[:, :, 1] = img[:, :, 1] + gaussian
    noisy_image[:, :, 2] = img[:, :, 2] + gaussian

cv2.normalize(noisy_image, noisy_image, 0, 255, cv2.NORM_MINMAX, dtype=-1)
noisy_image = noisy_image.astype(np.uint8)
return noisy_image

¿Puedo escribirlo sin usar numpy y específicamente np.random.normal u otro comando predefinido? ¿O cómo puedo implementar np.random.normal sin numpy?

¡Gracias de antemano!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible implementar la función np.random.normal sin utilizar numpy. Esta función forma parte de la biblioteca numpy y está diseñada específicamente para generar números aleatorios distribuidos normalmente.

    Sin embargo, existen formas alternativas de generar ruido gaussiano sin utilizar la función np.random.normal. Un enfoque es utilizar la función randn de la biblioteca OpenCV, que genera una matriz de números extraídos de una distribución normal con una media de 0 y una desviación estándar de 1. Puede escalar la salida de esta función por un factor de su elección para obtener la varianza deseada, y luego agregar este ruido a su imagen.

    Aquí hay un ejemplo de implementación de este enfoque:

    import cv2
    
    def agregar_ruido(img, var):
        media = 0
        std_dev = var ** 0.5
        gaussiano = std_dev * cv2.randn(img.shape[:2], dtype=cv2.CV_32F)
        imagen_ruidosa = img.astype(np.float32) + gaussiano
        cv2.normalize(imagen_ruidosa, imagen_ruidosa, 0, 255, cv2.NORM_MINMAX, dtype=-1)
        imagen_ruidosa = imagen_ruidosa.astype(np.uint8)
        return imagen_ruidosa
    

    En esta implementación, el parámetro var controla la varianza del ruido gaussiano, que se calcula como la raíz cuadrada de la varianza deseada. La función cv2.randn genera una matriz de números aleatorios con la misma forma que la imagen de entrada, y escalamos esto por la desviación estándar calculada antes de agregarlo a la imagen.

    Tenga en cuenta que debemos convertir los datos de la imagen a float32 antes de agregar el ruido para evitar desbordamiento de enteros, y luego normalizamos el resultado de nuevo al rango [0, 255] antes de convertirlo de nuevo a uint8.

Comments are closed.