首页 > 解决方案 > 为什么向图像添加高斯噪声会产生白屏?

问题描述

我在下面添加的图像(water_coins.jpg)中添加了一些高斯噪声,但它返回给我一个完全白色的空白屏幕(对于“noi”和“hoho”)。我不知道为什么

import numpy as np
import cv2


def gauss_noise(image):
    row, col, ch = image.shape
    mean = 0
    var = 0.01
    sigma = var ** 0.5
    gauss = np.random.normal(mean, sigma, (row, col, ch))
    gauss = gauss.reshape(row, col, ch)
    print(image)
    cv2.imshow("hoho", gauss + image)
    noisy = image + gauss
    return noisy


img = cv2.imread('water_coins.jpg')
noi = gauss_noise(img)
cv2.imshow("Noisy Gauss image", noi)
cv2.imshow("ho", img)
cv2.waitKey()

Water_coins.jpg

标签: python-3.ximageopencvimage-processinggaussian

解决方案


问题是,当您将一个类型的图像添加np.uint8到另一个类型为 float 的图像时,它将产生一个 float 数组。根据imshow 的文档,您可以:

如果图像是 32 位浮点,则像素值乘以 255。即取值范围 [0,1] 映射到 [0,255]。

这意味着任何大于 1.0 的值都是白色的,只有 0 是黑色的,在您的情况下,它们中的大多数都是白色的,因此是白色图像。

现在到解决方案:

  1. 将其转换为 uint8 -> 您必须小心下溢(负数)和上溢(超过 255)。尝试双边截断,并决定如何处理小数部分(round, truncate, ceil)。

  2. 将数据标准化为 0-1 -> 取决于您想要执行的操作,这可能很危险,因为它可能会改变颜色,例如,如果所有颜色都在 120-150 左右,您将获得标准化的图像颜色,就好像它一样从 0 到 255。

  3. 将噪声数组转换为np.uint8添加前,并使用 cv2.add 避免饱和问题(下溢和上溢)


推荐阅读