Dodawanie szumu do obrazu polega na odchylaniu wartości pikseli obrazu, zaburzając go w sposób losowy. Możemy generować szum za pomocą różnych generatorów liczb losowych. Dwie informacje w ramach przypomnienia: Pamiętajcie, że nie wszystkie generatory dają wartości wycentrowane na 0, dlatego czasem trzeba je wyśrodkować. Drugie przypomnienie to fakt, że jeżeli przekroczymy wartości skrajne uint8, to wartości będą zastępowane w sposób cykliczny, czyli \(255+5=0+5\) oraz \(0-55=255-55\), co może być niepożądanym efektem. Tutaj również można porównywać kilka różnych metod albo sprawdzić jedną metodę dla różnych parametrów. Stopień zaszumienia możemy regulować za pomocą jakiegoś parametru alpha.

alpha=0.5 # 0-1

sigma = 25 # tym można sterować
gauss = np.random.normal(0,sigma,(img.shape))
noisy1 = (img + alpha * gauss).clip(0,255).astype(np.uint8)


beta=0.01    # małe wartoci                    
vals = len(np.unique(img))
vals =  beta * 2 ** np.ceil(np.log2(vals))
noisy2 = (np.random.poisson(img * vals) / float(vals)).clip(0,255).astype(np.uint8)


Noise_range=[-25,25] #zakres szumu 
rand = (Noise_range[1]-Noise_range[0])*np.random.random((img.shape))+Noise_range[0]
noisy3 = (img + alpha * rand).clip(0,255).astype(np.uint8)

Inne generatory liczb losowych, które mogą wam się przydać (doczytać w dokumentacji):

I na koniec parametryczny generator szumu sól i pieprz (nie dla zajęć z SM):

def noise_SnP(img,S=255,P=0,rnd=(333,9999)):
    r , c = img.shape
    number_of_pixels = random.randint(rnd[0], rnd[1])
    for i in range(number_of_pixels):
        y=random.randint(0, r - 1)
        x=random.randint(0, c - 1)
        img[y][x] = S
    number_of_pixels = random.randint(rnd[0], rnd[1])
    for i in range(number_of_pixels):
        y=random.randint(0, r - 1)
        x=random.randint(0, c - 1)
        img[y][x] = P
    return img