Почему добавление гауссовского шума к изображению дает белый экран? - PullRequest
0 голосов
/ 01 июня 2018

Я добавил немного гауссовского шума к изображению (water_coins.jpg), которое добавлено ниже, но оно возвращает мне полностью белый пустой экран (как для «noi», так и для «hoho»).Я не могу понять, почему

import numpy as np
import cv2


def gauss_noise(image):
    row, col, ch = image.shape
    mean = 0
    var = 0.01
    sigma = var ** 0.5
    gauss = np.random.normal(mean, sigma, (row, col, ch))
    gauss = gauss.reshape(row, col, ch)
    print(image)
    cv2.imshow("hoho", gauss + image)
    noisy = image + gauss
    return noisy


img = cv2.imread('water_coins.jpg')
noi = gauss_noise(img)
cv2.imshow("Noisy Gauss image", noi)
cv2.imshow("ho", img)
cv2.waitKey()

Water_coins.jpg

1 Ответ

0 голосов
/ 01 июня 2018

Проблема заключается в том, что при добавлении изображения типа np.uint8 к другому типу с плавающей точкой это приведет к созданию массива с плавающей точкой.Согласно документации imshow , у вас есть следующее:

Если изображение с 32-разрядной плавающей точкой, значения пикселей умножаются на 255. То есть диапазон значений [0,1] отображается на [0,255].

Это означает, что любое значение больше 1,0 будет белым, и только 0 будет черным, в вашем случае большинство из них будет белым, поэтомубелое изображение.

Теперь к решениям:

  1. Преобразовать его в uint8 -> Вы должны быть осторожны с недополнением (отрицательные числа) и переполнением (более 255).Попробуйте двустороннее усечение, а также решите, что делать с десятичной частью (round, truncate, ceil).

  2. Нормализуйте данные до 0-1 -> в зависимости от того, что выхотеть сделать это может быть опасно, так как это может изменить цвета, например, если все цвета будут приблизительно 120-150, вы получите в нормализованных цветах изображения, как будто это было от 0-255.

  3. Перед добавлением преобразуйте массив шумов в np.uint8 и используйте cv2.add, чтобы избежать проблем насыщения (недостаточного или переполнения)

...