我正试着在“神经病”的图像中添加噪音。我正在使用imread,但似乎无法读取所需格式的图像,以将噪声添加到整个图像中的各个像素。我希望有人能知道我是如何做到这一点的。
具体地说,我的任务是在参与者自己的感知阈值上向他们呈现刺激。我正在使用一种自适应的阶梯程序(任务处理器)在试验之间滴定添加到图像中的噪声量以达到这个阈值。也就是说,参与者正确地识别了图像,下一张图像具有更多的噪声;他们错误地识别了图像,下一次试验具有较少的噪声。我们通过重复试验来获得参与者正确回答特定百分比试验所需的噪声量。
我试图通过改变单个像素来添加高斯噪声,从而在每次试验中添加与任务处理器传递的噪声百分比相等的噪声量。我不希望更改原始图像。我设想这是通过将图像读取为像素矩阵,复制它,向该矩阵中的像素添加噪声,并为该试验提供新的刺激来实现的。我用来读取图像的imread函数似乎无法做到这一点--有人有什么建议吗?
发布于 2020-03-11 09:02:16
我已经演示了如何使用cv2读取图像并对其应用不同级别的噪声。噪声添加不会修改原始图像。正如@Michael MacAskill在他的评论中所写的那样,你可以通过一个向量运算将噪声应用于图像。在我的回答中,我创建了一个均值为1且形状与图像相同的高斯,并将其与图像相乘。可以通过增加高斯噪声分布的标准差来增加噪声水平。
import cv2
import matplotlib.pyplot as plt
import numpy as np
def apply_noise(image, scale):
"""Return image with noise.
Parameters
----------
image : ndarray, image to which noise is applied.
scale : positive float, standard deviation of Gaussian
noise distribution.
"""
image = np.asarray(image)
# Create a Gaussian noise array.
noise = np.random.normal(loc=1.0, scale=scale, size=image.shape)
# Apply the noise array.
noisy = image * noise
# Tranform to integer type.
noisy = noisy.astype(np.int32)
# Clip the values to RGB bounds.
noisy = noisy.clip(0, 255)
return noisy我使用以下命令下载了一个示例图像
wget -qO "astronaut.jpg" https://live.staticflickr.com/8674/16504233985_9f1060624e_q_d.jpg下面是示例结果。原图:
img = cv2.imread("astronaut.jpg")
# Transform from BGR to RGB
img = img[..., ::-1]
plt.imshow(img)

应用了一些噪波的图像:
img_a = apply_noise(image=img, scale=0.1)
plt.imshow(img_a)
plt.title("Gaussian std. dev. = 0.1")

应用了更多噪波的图像:
img_b = apply_noise(image=img, scale=0.5)
plt.imshow(img_b)
plt.title("Gaussian std. dev. = 0.5")

https://stackoverflow.com/questions/60481937
复制相似问题