Неожиданное выходное изображение при добавлении двух массивов numpy

Я пытаюсь добавить гауссовский шум к своему изображению, используя 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()

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

Ваш код вообще не использует переменную noise.

John Zwinck 22.05.2019 15:20

О да, я действительно пропустил эту строку кода, когда писал свой вопрос. Спасибо, что указали на это. Я исправил это. Можете ли вы решить проблему сейчас?

Rishabh 22.05.2019 15:35

Что если поменять 1 на 0.1?

John Zwinck 22.05.2019 15:37
fast — это массив с плавающей запятой. cv2.imshow ожидает, что массивы с плавающей запятой будут иметь значения в диапазоне [0, 1]. Попробуйте cv2.imshow('Noisy', fast/fast.max()).
Warren Weckesser 22.05.2019 15:52

Также обратите внимание, что np.random.normal(0, 1, (row, col)) будет включать отрицательные значения, что означает, что fast + noise может иметь отрицательные значения. Это то, что вы хотите?

Warren Weckesser 22.05.2019 15:54
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
5
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Попробуй это

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

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

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

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

Да, это решило проблему. Но разве я не могу видеть изображения, используя только массив numpy типа данных float? Просьба уточнить.

Rishabh 22.05.2019 15:45

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

steve3nto 23.05.2019 10:03

Другие вопросы по теме