<p>不确定这是否会产生完全相同的结果-因为有一种可能性(非常小),你可以用盐击中一个像素,然后再用胡椒再次击中同一个像素-但我尝试了不同的方法。它还能产生半盐半胡椒,其他溶液只有在对大量样本进行平均时才会产生。也许节省的速度和内存值得不精确性—YMMV:-)</p>
<p>首先确定有多少像素将受到噪声的影响,称之为<code>N</code>。然后生成N/2对[x,y]坐标并将输出图像中的对应像素设置为黑色,然后生成另一N/2对[x,y]坐标并将其设置为白色</p>
<pre><code>import numpy as np
def me(image,prob):
h, w = image.shape[:2]
# Number of noise affected pixels
N = int(w * h * prob)
# Half salt
image[np.random.randint(0,h,int(N/2)), np.random.randint(0,w,int(N/2))] = 255
# Half pepper
image[np.random.randint(0,h,int(N/2)), np.random.randint(0,w,int(N/2))] = 0
return image
# Make solid grey start image
image = np.full((400,400), 128, dtype=np.uint8)
</code></pre>
<p>通过<code>p=0.1</code>和<code>p=0.01</code>,我得到:</p>
<pre><code>%timeit me(image,0.1)
296 µs ± 2.48 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit me(image,0.01)
42.2 µs ± 933 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
</code></pre>
<p><a href="https://i.stack.imgur.com/RPQgR.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/RPQgR.png" alt="enter image description here"/></a></p>
<p><a href="https://i.stack.imgur.com/Nu9io.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/Nu9io.png" alt="enter image description here"/></a></p>