如何使用 numpy 生成具有选定空间分布的噪声?
How to generate noise with a chosen spatial distribution with 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
但是,我需要图像中心的噪点更强烈,离中心越远越弱。
理想情况下,我可以调节噪声的空间分布参数,以便我的 noise
变量包含:
- 初始化:所有图像上出现强烈且均匀的噪点
- 早期阶段:中心有强烈噪音,边缘噪音较少
- Mid-stages : 中心有噪音,边缘没有更多噪音
- 后期阶段:所有图像上不再有噪点(全为零)
有人知道怎么做吗?非常感谢任何帮助!
可以作为起点的东西:
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()
输出:
此处噪声是从高斯分布中采样的,但均匀分布应该可以正常工作。
重要的部分是通过高斯 对噪声进行加权 以获得您想要的效果。
您可能需要调整 A
(振幅)和 w
(展开)以满足您的需要(可能只是两个列表)。您想要高振幅并尽早传播,然后首先降低传播可能会增加振幅,然后将振幅降低到零。
我想以类似于此的方式为图像添加噪点:
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
但是,我需要图像中心的噪点更强烈,离中心越远越弱。
理想情况下,我可以调节噪声的空间分布参数,以便我的 noise
变量包含:
- 初始化:所有图像上出现强烈且均匀的噪点
- 早期阶段:中心有强烈噪音,边缘噪音较少
- Mid-stages : 中心有噪音,边缘没有更多噪音
- 后期阶段:所有图像上不再有噪点(全为零)
有人知道怎么做吗?非常感谢任何帮助!
可以作为起点的东西:
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()
输出:
此处噪声是从高斯分布中采样的,但均匀分布应该可以正常工作。
重要的部分是通过高斯 对噪声进行加权 以获得您想要的效果。
您可能需要调整 A
(振幅)和 w
(展开)以满足您的需要(可能只是两个列表)。您想要高振幅并尽早传播,然后首先降低传播可能会增加振幅,然后将振幅降低到零。