我正在尝试为心理图像添加噪音。我使用的是imread,但似乎无法读取所需的格式,该格式需要在整个图像中为各个像素添加噪点。我希望有人可能对如何做到这一点有所了解。
[具体来说,我的任务是按照自己的感知阈值向参与者呈现刺激。我正在使用自适应阶梯程序(任务处理程序)在两次试验之间滴定添加到图像的噪声量以达到此阈值。即,参与者正确识别了该图像,下一幅图像有更多噪点;它们会错误地识别图像,因此下一次尝试的噪音会更低。我们通过重复试验来执行此操作,以获取参与者正确回答一定百分比的试验所需的噪声量。
我正在尝试通过更改单个像素以添加高斯噪声,在每次尝试时增加一定数量的噪声,该噪声等于从任务处理程序传递的噪声的百分比。我不想更改原始图像。我通过将图像读取为像素矩阵,进行复制,为该矩阵中的像素添加噪点并为该试验提供新的刺激力来实现这一目标。我用来读取图像的读取功能似乎无法执行此操作-有人有任何建议吗?
我已经演示了如何使用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")