python-3.x - 为什么向图像添加高斯噪声会产生白屏?
问题描述
我在下面添加的图像(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()
解决方案
问题是,当您将一个类型的图像添加np.uint8
到另一个类型为 float 的图像时,它将产生一个 float 数组。根据imshow 的文档,您可以:
如果图像是 32 位浮点,则像素值乘以 255。即取值范围 [0,1] 映射到 [0,255]。
这意味着任何大于 1.0 的值都是白色的,只有 0 是黑色的,在您的情况下,它们中的大多数都是白色的,因此是白色图像。
现在到解决方案:
将其转换为 uint8 -> 您必须小心下溢(负数)和上溢(超过 255)。尝试双边截断,并决定如何处理小数部分(round, truncate, ceil)。
将数据标准化为 0-1 -> 取决于您想要执行的操作,这可能很危险,因为它可能会改变颜色,例如,如果所有颜色都在 120-150 左右,您将获得标准化的图像颜色,就好像它一样从 0 到 255。
将噪声数组转换为
np.uint8
添加前,并使用 cv2.add 避免饱和问题(下溢和上溢)
推荐阅读
- ios - 当导航栏中的 UISearchBar 是 firstResponder 时,UIButton 不调用操作
- lampp - 使用 LAMPP 设置本地服务器时未发现错误
- node.js - 在 nodejs 中允许或限制用户的文件转发
- r - 在 R 中放大 dyGraphs 并将图像保存为 png
- javafx - 如何使用 JFoenix 等待显示下一个 toast (snackBar)
- python - 如何使用“可嵌入的 zip 文件”安装 Python
- c++ - `::*`(冒号星号)在 C++ 中是什么意思?
- elasticsearch - Elasticsearch搜索数组的长度
- rabbitmq - 使用 RabbitMQ (rabbitmq_delayed_message_exchange) 为生产使用调度消息有多好
- java - itext7 中 Chunk.NEWLINE 的替代品是什么