Неожиданный вывод изображения при добавлении двух массивов - PullRequest
2 голосов
/ 22 мая 2019

Я пытаюсь добавить гауссовский шум к своему изображению, используя opencv-python.Я создал функцию шума, но добавление функции шума к изображению дает неожиданные результаты.

Я создал функцию шума, используя нормальное распределение Гаусса из numpy.random.Затем, изменив функцию шума, я добавил ее к своему изображению. Я попытался распечатать массив.Там сумма находится в интервале [0, 255], но затем также размываются части изображения.Я также попытался распечатать типы данных массива.Первоначально было uint8, в то время как позже было float64 (я не думаю, что это будет иметь какое-либо значение).

import numpy as np
import cv2

fast = cv2.imread('Fast8.jpg', 0)

row, col = fast.shape
noise = np.random.normal(0, 1, (row, col))
fast = fast + noise
cv2.namedWindow('Noisy', cv2.WINDOW_NORMAL)
cv2.imshow('Noisy', fast)
cv2.waitKey(0)
cv2.destroyAllWindows()

В результате вышеприведенного кода я получаю размытое изображение с едва видимыми областями..

1 Ответ

1 голос
/ 22 мая 2019

Вы загружаете изображение как uint8, но при суммировании float вы получаете float. Чтобы увидеть результат, вам нужно снова привести его к типу int.

Попробуйте это

cv2.imshow('Noisy', fast.astype(np.uint8))

Конечно, вы получите изменение в значении только тогда, когда шум достаточно велик, чтобы значение пикселя переместилось с одного целого на другое.

В качестве альтернативы вы можете работать в диапазоне [0,1] или [-1, 1], используя scikit-image, который часто использует эти другие соглашения.

[Дополнительные разъяснения] cv2.imshow работает как объяснено в этом потоке переполнения стека -> LINK Таким образом, вы должны решить, использовать ли плавающие изображения в диапазоне [0, 1] или изображения uint8 в диапазоне [0, 255] или изображения uint16 / uint32 с большим целочисленным диапазоном. Поскольку стохастические функции часто генерируют в небольшом диапазоне с плавающей точкой около 0, я предлагаю вам преобразовать ваше изображение, разделив его на 255,0, чтобы получить его в диапазоне [0, 1] с плавающей точкой и работать оттуда.

...