Добавление шума к изображению психопия - PullRequest
1 голос
/ 02 марта 2020

Я пытаюсь добавить шум к изображениям в психопии. Я использовал imread, но не смог прочитать изображения в формате, необходимом для добавления шума к отдельным пикселям по всему изображению. Я надеюсь, что у кого-то могут быть идеи о том, как я смогу это сделать.

В частности, моя задача представляет стимулы участникам на их собственном пороге восприятия. Я использую процедуру адаптивной лестничной клетки (обработчик квестов) для титрования между испытаниями количества шума, добавляемого к изображению для достижения этого порога. т.е. участник правильно идентифицирует изображение, следующее изображение имеет больше шума; они неправильно идентифицируют изображение, в следующем испытании меньше шума. Мы делаем это в течение повторных испытаний, чтобы получить количество шума, необходимое участникам для правильного ответа на определенный процент испытаний.

Я пытаюсь добавить количество шума в каждом испытании, равное проценту шума, передаваемого обработчиком квеста, путем изменения отдельных пикселей для добавления гауссовского шума. Я не буду изменять оригинальное изображение. Я предполагаю эту работу, читая изображение в виде матрицы пикселей, копируя его, добавляя шум к пикселям в этой матрице и представляя новый стимул для этого испытания. Функция imread, которую я использовал для чтения своих изображений, не способна сделать это - есть ли у кого-нибудь предложения?

1 Ответ

0 голосов
/ 11 марта 2020

Я продемонстрировал, как можно читать изображение с 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)

astronaut

Изображение с некоторым шумом:

img_a = apply_noise(image=img, scale=0.1)
plt.imshow(img_a)
plt.title("Gaussian std. dev. = 0.1")

astronaut with some noise applied

Изображение с большим шумом:

img_b = apply_noise(image=img, scale=0.5)
plt.imshow(img_b)
plt.title("Gaussian std. dev. = 0.5")

astronaut with more noise applied

...