【问题标题】:Adding noise to an image psychopy在图像中添加噪声
【发布时间】:2020-06-14 08:11:27
【问题描述】:

我正在尝试在psychopy 中为图像添加噪点。我正在使用 imread 但似乎无法读取所需格式的图像,从而为整个图像的单个像素添加噪点。我希望有人可能对我如何能够做到这一点有想法。

具体来说,我的任务以参与者自己的感知阈值向他们提供刺激。我正在使用自适应楼梯程序(任务处理程序)在试验之间滴定添加到图像中的噪声量以达到此阈值。即参与者正确识别图像,下一张图像有更多噪声;他们错误地识别图像,下一次试验的噪音较小。我们在重复试验中这样做,以获得参与者正确回答一定百分比的试验所需的噪音量。

我试图通过更改单个像素以添加高斯噪声,在每次试验中添加一定量的噪声,该噪声量等于从任务处理程序传递的噪声百分比。我不想改变原始图像。我设想这是通过将图像作为像素矩阵读取、复制、向该矩阵中的像素添加噪声、并为该试验呈现新的刺激来实现的。我用来读取图像的 imread 功能似乎无法做到这一点 - 有人有什么建议吗?

【问题讨论】:

  • imread 应该返回一个允许您通过像素坐标直接访问像素的对象:请参阅docs.opencv.org/3.4/d5/d98/tutorial_mat_operations.html,记住按下“Python”按钮以查看正确的语法。
  • 这很有帮助,谢谢。我认为我坚持使用它的地方是我希望避免使用坐标逐个像素地搜索以添加噪声 - 我拥有的脚本是添加一定百分比的随机噪声分布。我是否正确,这种方法需要使用它们的坐标搜索我想改变的每个像素?
  • 不,它是一个矩阵,因此(例如使用numpy 库),您可以获取噪声分布矩阵并将图像的所有相应元素(即像素)和噪声相加步骤(即单个矩阵加法)。例如stackoverflow.com/a/30624520/3592211
  • 好的。您提供的代码是我为给我的图像添加噪点而改编的代码。我们试图实现它的错误导致我们相信我们的图像没有被正确读取。我将尝试使用您第一条评论中的信息进行编辑,并会更新是否成功!
  • 好的,祝你好运。如果问题仍然存在,要获得关于 SO(而不是像这样的 cmets 流)有用的特定答案,您可能应该编辑帖子以显示您使用的代码(理想情况下是可以实际运行的摘录)和确切的输出您收到的任何错误消息(和/或有关它如何以其他方式未能达到预期目的的描述)。

标签: python image noise psychopy


【解决方案1】:

我已经演示了如何使用cv2 读取图像并对其应用不同级别的噪声。噪声添加不会修改原始图像。正如@Michael MacAskill 在他的 cmets 中所写,您可以通过单个矢量操作将噪声应用于图像。在我的回答中,我创建了一个均值为 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")

【讨论】:

    猜你喜欢
    • 2021-04-09
    • 2014-09-05
    • 2018-08-06
    • 2021-07-04
    • 2013-10-17
    • 2019-09-12
    • 1970-01-01
    • 2014-01-10
    • 2017-07-31
    相关资源
    最近更新 更多