将高斯噪声添加到没有 numpy 的图像

Posted

技术标签:

【中文标题】将高斯噪声添加到没有 numpy 的图像【英文标题】:Add Gaussian Noise to an image without numpy 【发布时间】:2022-01-20 00:06:25 【问题描述】:

我正在尝试使用 Python 向图像添加高斯噪声。我正在使用下面的代码来定义我的函数添加噪声。到目前为止,它工作正常,但我必须在没有来自 numpy 的现成命令的情况下这样做。我只想使用 cv2。 代码如下:

def add_noise(img):
  
    mean = 0
    var = 10
    sigma = var ** 1.5
    gaussian = np.random.normal(mean, sigma, (512,512)) 
    #np.zeros((224, 224), np.float32

    noisy_image = np.zeros(img.shape, np.float32)

    if len(img.shape) == 2:
        noisy_image = img + gaussian
    else:
        noisy_image[:, :, 0] = img[:, :, 0] + gaussian
        noisy_image[:, :, 1] = img[:, :, 1] + gaussian
        noisy_image[:, :, 2] = img[:, :, 2] + gaussian

    cv2.normalize(noisy_image, noisy_image, 0, 255, cv2.NORM_MINMAX, dtype=-1)
    noisy_image = noisy_image.astype(np.uint8)
    return noisy_image

我可以在不使用 numpy 并且特别是 np.random.normal 或其他准备好的命令的情况下编写它吗? 或者如何在没有 numpy 的情况下实现 np.random.normal;

提前谢谢你!

【问题讨论】:

没有 numpy 但有 cv2?你使用哪个库有什么关系? OpenCV 有cv2.randn,其作用与np.random.normal 相同。 你知道你正在添加灰色噪音吗? 灰色是什么意思?这不是高斯噪声吗? 【参考方案1】:

在给定函数nextDouble() 的情况下,有一个标准技巧(来自 Knuth 的计算机编程艺术)生成高斯噪声,该函数生成一个介于 0 和 1 之间的均匀随机数。

while True:
   # Calculate a random point inside a unit sphere
   # nextDouble() is whatever random number generate you want that generates
   # a uniformly distributed random number between 0 and 1
   v1 = 2 * nextDouble() - 1 # between -1.0 and 1.0
   v2 = 2 * nextDouble() - 1 # between -1.0 and 1.0
   s = v1 * v1 + v2 * v2
   if (s < 1):  # This succeeds π/4 of the time, so > 75%
      break
norm = math.sqrt(-2 * math.log(s) / s)

# value1 and value2 are two non-correlated gaussian values with average 0
# and standard deviation 1
value1 = v1 * norm
value2 = v2 * norm

【讨论】:

以上是关于将高斯噪声添加到没有 numpy 的图像的主要内容,如果未能解决你的问题,请参考以下文章

图像处理:随机添加椒盐噪声和高斯噪声Python

图像处理:随机添加椒盐噪声和高斯噪声Python

如何正确地给图像添加高斯噪声

Opencv——图像添加椒盐噪声高斯滤波去除噪声原理及手写Python代码实现

使用 imnoise 为图像添加高斯噪声

python使用opencv对图像添加(高斯/椒盐/泊松/斑点)噪声