如何用numpy选择空间分布产生噪声?

时间:2016-06-30 20:01:06

标签: python numpy image-processing matplotlib noise

我想以类似于此的方式为图像添加噪点:

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变量包含:

  • 初始化:所有图像上的强烈且均匀的噪音
  • 早期阶段:中心噪音较大,边界噪音较小
  • 中期:中心有噪音,边境没有噪音
  • 后期阶段:所有图像上没有噪音(全部为零)

有谁知道这样做的方法?任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:1)

你可以用作起点的东西:

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()

带输出:

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

这里噪声是从高斯分布中采样的,但均匀分布应该可以正常工作。

重要的部分是用高斯来加重噪音以获得你想要的效果。

您可能需要调整A(幅度)和w(点差)以满足您的需求(它可能只是两个列表)。你想要高幅度和早期扩展,然后首先减少扩散可能增加幅度,然后将幅度减小到零。