una sal ruido pimienta imagen gaussiano agregar python opencv

una - Cómo agregar ruido(gaussiano/sal y pimienta, etc.) a la imagen en Python con OpenCV



agregar ruido gaussiano a una imagen en matlab (3)

La función agrega ruido gaussiano, de sal y pimienta, poisson y moteado en una imagen

Parameters ---------- image : ndarray Input image data. Will be converted to float. mode : str One of the following strings, selecting the type of noise to add: ''gauss'' Gaussian-distributed additive noise. ''poisson'' Poisson-distributed noise generated from the data. ''s&p'' Replaces random pixels with 0 or 1. ''speckle'' Multiplicative noise using out = image + n*image,where n is uniform noise with specified mean & variance. import numpy as np import os import cv2 def noisy(noise_typ,image): if noise_typ == "gauss": row,col,ch= image.shape mean = 0 var = 0.1 sigma = var**0.5 gauss = np.random.normal(mean,sigma,(row,col,ch)) gauss = gauss.reshape(row,col,ch) noisy = image + gauss return noisy elif noise_typ == "s&p": row,col,ch = image.shape s_vs_p = 0.5 amount = 0.004 out = np.copy(image) # Salt mode num_salt = np.ceil(amount * image.size * s_vs_p) coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape] out[coords] = 1 # Pepper mode num_pepper = np.ceil(amount* image.size * (1. - s_vs_p)) coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape] out[coords] = 0 return out elif noise_typ == "poisson": vals = len(np.unique(image)) vals = 2 ** np.ceil(np.log2(vals)) noisy = np.random.poisson(image * vals) / float(vals) return noisy elif noise_typ =="speckle": row,col,ch = image.shape gauss = np.random.randn(row,col,ch) gauss = gauss.reshape(row,col,ch) noisy = image + image * gauss return noisy

Esta pregunta ya tiene una respuesta aquí:

Me pregunto si existen algunas funciones en Python con OpenCV o en alguna otra biblioteca de procesamiento de imágenes de Python que agregue ruido gaussiano o de sal y pimienta a una imagen. Por ejemplo, en MATLAB existen funciones directas que hacen el mismo trabajo.

O, ¿cómo agregar ruido a una imagen usando Python con OpenCV?


No sé si hay algún método en la API de Python. Pero puedes usar este código simple para agregar ruido de sal y pimienta a una imagen.

import numpy as np import random import cv2 def sp_noise(image,prob): '''''' Add salt and pepper noise to image prob: Probability of the noise '''''' output = np.zeros(image.shape,np.uint8) thres = 1 - prob for i in range(image.shape[0]): for j in range(image.shape[1]): rdn = random.random() if rdn < prob: output[i][j] = 0 elif rdn > thres: output[i][j] = 255 else: output[i][j] = image[i][j] return output image = cv2.imread(''image.jpg'',0) # Only for grayscale image noise_img = sp_noise(image,0.05) cv2.imwrite(''sp_noise.jpg'', noise_img)


solo mire cv2.randu() o cv.randn (), todo es bastante similar a matlab, supongo.

vamos a jugar un poco;):

import cv2 import numpy as np >>> im = np.empty((5,5), np.uint8) # needs preallocated input image >>> im array([[248, 168, 58, 2, 1], # uninitialized memory counts as random, too ? fun ;) [ 0, 100, 2, 0, 101], [ 0, 0, 106, 2, 0], [131, 2, 0, 90, 3], [ 0, 100, 1, 0, 83]], dtype=uint8) >>> im = np.zeros((5,5), np.uint8) # seriously now. >>> im array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], dtype=uint8) >>> cv2.randn(im,(0),(99)) # normal array([[ 0, 76, 0, 129, 0], [ 0, 0, 0, 188, 27], [ 0, 152, 0, 0, 0], [ 0, 0, 134, 79, 0], [ 0, 181, 36, 128, 0]], dtype=uint8) >>> cv2.randu(im,(0),(99)) # uniform array([[19, 53, 2, 86, 82], [86, 73, 40, 64, 78], [34, 20, 62, 80, 7], [24, 92, 37, 60, 72], [40, 12, 27, 33, 18]], dtype=uint8)

para aplicarlo a una imagen existente, solo genere ruido en el rango deseado y agréguelo:

img = ... noise = ... image = img + noise