2016-06-30 23 views
2

Ich möchte Lärm in einer Art und Weise ähnlich der zu einem Bild hinzuzufügen:Wie erzeugt man Rauschen mit einer gewählten räumlichen Verteilung mit numpy?

import numpy as np 
import matplotlib.pyplot as plt 

myImage = plt.imread('Pikachu.png') 
noise = np.random.normal(0, 0.1, (myImage.shape[0], myImage.shape[1])) 

noisyImage = myImage + noise 

Allerdings würde ich den Lärm brauchen intensivere in der Mitte des Bildes zu sein, und weniger intensiv, wie wir weiter kommen aus das Zentrum.

Idealerweise konnte ich die räumliche Verteilung Parameter des Rausches regulieren, so dass mein noise Variable enthält:

  • Initialisierung: Intensive und gleichmäßige Rauschen auf alle Bild
  • Frühe Stadien: Intensives Lärm im Zentrum , weniger Lärm an den Grenzen
  • Mid-Stufen: Geräusch in der Mitte, nicht mehr Lärm an der Grenze
  • späte Stadien: nicht mehr Rauschen auf alle Bild (alle Nullen)

Kennt jemand einen Weg, es zu tun? Jede Hilfe wird wirklich geschätzt!

+4

Erstellen Sie eine Gaußsche Matrix mit der gleichen Form wie Ihr Bild und multiplizieren Sie sie elementweise mit der Rauschmatrix – Aguy

+0

** Init: ** haben sehr große Spread/Std Dev, multiplizieren durch große Zahl ** früh (Mitte) : ** Low spread/std dev, multipliziert mit der großen (kleinen) Zahl ** spät: ** multiplizieren Sie das Rauschen mit Null –

Antwort

1

Etwas könnte man als Ausgangspunkt verwenden:

import numpy as np 
import matplotlib.pyplot as plt 

def gauss2D(shape,sx=1,sy=1): 
    """ 
    unnormalized 2D gauss centered on mean value, 
    given shape and standard dev (sx and sy). 
    """ 
    mx = shape[0]/2 
    my = shape[1]/2 

    return np.exp(-0.5*(
     ((np.arange(shape[0])[:,None]-mx)/sx)**2+ 
     ((np.arange(shape[0])[None,:]-my)/sy)**2 
     ))#/(2*np.pi*sx*sy) 

width,height = 64,64 
my_img = np.zeros((width,height,3))+0.9 
fig = plt.figure() 
ax = fig.gca() 
N=5 
for i in range(N): 
    my_img[:,:,:]=0.5 #gray bg image 
    w = N*100/(4**(2*i)) 
    A = (1-.1*(i+1)) 
    noise =A*np.random.normal(0,w,(width,height))*gauss2D((width,height),10,10) 
    plt.imshow(my_img+noise[:,:,None]) #noise affects rgb equally 
    plt.title(i) 
    plt.show() 

mit Ausgang:

enter image description here enter image description here enter image description here enter image description here enter image description here

Hier wird das Rauschen von einer Gaußschen Verteilung abgetastet wurde, aber eine gleichmäßige Verteilung sollte w Ork gut.

Der wichtige Teil ist gewichten Sie das Rauschen von einem Gaußschen, um den gewünschten Effekt zu bekommen.

Sie könnten zwicken A (Amplitude) und w (Spread) auf Ihre Bedürfnisse passen (es könnte nur zwei Listen sein). Sie möchten eine hohe Amplitude und eine frühe Ausbreitung, dann verringern Sie zuerst die Ausbreitung, erhöhen Sie möglicherweise die Amplitude und verringern Sie dann die Amplitude auf Null.