簡體   English   中英

向圖像心理添加噪聲

[英]Adding noise to an image psychopy

我試圖在心理中為圖像添加噪音。 我正在使用 imread 但似乎無法以向整個圖像中的單個像素添加噪聲所需的格式讀取圖像。 我希望有人可能對我如何能夠做到這一點有想法。

具體來說,我的任務是以參與者自己的感知閾值向參與者呈現刺激。 我正在使用自適應樓梯程序(任務處理程序)在試驗之間滴定添加到圖像中的噪聲量以達到此閾值。 即參與者正確識別圖像,下一個圖像有更多的噪聲; 他們錯誤地識別了圖像,下一次試驗的噪音更少。 我們在重復試驗中這樣做,以獲得參與者正確回答一定百分比試驗所需的噪音量。

我試圖通過改變單個像素來添加高斯噪聲,在每次試驗中添加一個等於從任務處理程序傳遞的噪聲百分比的噪聲量。 我不想改變原始圖像。 我設想通過將圖像作為像素矩陣讀取,復制它,向該矩陣中的像素添加噪聲,並為該試驗呈現新的刺激來實現這一工作。 我用來讀取圖像的 imread 函數似乎無法做到這一點 - 有沒有人有任何建議?

我已經演示了如何使用cv2讀取圖像並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")

應用更多噪音的宇航員

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM