"""
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.
Taken from https://stackoverflow.com/questions/22937589/how-to-add-noise-gaussian-salt-and-pepper-etc-to-image-in-python-with-opencv
"""
import numpy as np
import os
import cv2 as cv
def toIntImage(frame):
frame *= 255
return frame.astype(np.uint8)
def normaliseImage(frame):
"""
Convert to greyscale, and to 64bit floating point.
Normalise pixel values to [0,1] range.
It assumes an 8bit integer image as input and does
no error checking.
"""
grey = cv.cvtColor(frame, cv.COLOR_BGR2GRAY).astype(np.float64)
grey /= 255
return grey
def addGaussNoise(image,var=0.02):
row,col = image.shape
mean = 0
sigma = var**0.5
gauss = np.random.normal(mean,sigma,(row,col))
gauss = gauss.reshape(row,col)
noisy = image + gauss
return noisy
def addSaltPepperNoise(image,amount=0.01):
row,col = image.shape
s_vs_p = 0.5
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[tuple(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[tuple(coords)] = 0
return out
def addPoissonNoise(image):
"Not reviewed"
vals = len(np.unique(image))
vals = 2 ** np.ceil(np.log2(vals))
noisy = np.random.poisson(image * vals) / float(vals)
return noisy
def addSpeckleNoise(image):
"Not reviewed"
row,col = image.shape
gauss = np.random.randn(row,col)
gauss = gauss.reshape(row,col)
noisy = image + image * gauss
return noisy