Как я могу лучше добавить шум в Python? - PullRequest
0 голосов
/ 22 октября 2019

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

Вот мой код:

[in]:

import cv2
import numpy as np
import matplotlib.pyplot as plt


# Read image with cv2
image = cv2.imread('example_image.jpg' , 1)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Display image
imshow(image_rgb)
# R,G,B channel separation
R, G, B = cv2.split(image_rgb)
# Creating Noise

noise_R = np.random.uniform(R.min(),R.max()*0.1, R.size)
noise_R.shape = (256,256)
noise_G = np.random.uniform(B.min(),B.max()*0.1, G.size)
noise_G.shape = (256,256)
noise_B = np.random.uniform(G.min(), G.max()*0.1, B.size)
noise_B.shape = (256,256)

# Adding noise to each channel separately

R = R + noise_R
G = G + noise_G
B = B + noise_B
rgb_noise = R + G + B

noisy_image = image + rgb_noise

[out]:

ValueError: operands could not be broadcast together with shapes (256,256,3) (256,256) 

Я получаю ValueError, чтоформы массива для rgb_noise и изображения не равны. Я попытался изменить форму rgb_noise для изображения, но я получаю ошибку размера. Как это исправить? Есть ли лучший метод?

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Вы можете быть проще и добавить шум только с помощью массива numpy.

import numpy
import matplotlib.pyplot as plt
import cv2

Посмотрите, построение изображения будет хорошо работать только с ноутбуками Jupyter. Выполните cv2.imshow () для других IDE.

1) Сделайте свое изображение

img = cv2.imread('path').astype(np.uint0)

2) Произведите случайный шум

r, g, b = img.shape
noise = np.random.randint(0,255,r*g*b).reshape(r,g,b)

3) Смешайте их

image_with_noise = cv2.addWeighted(img,0.5,noise,0.5,0)

Вы можете настроить значения альфа и бета.

Там у вас есть шумное изображение!

1 голос
/ 22 октября 2019

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

Изменение этого значения:

noise_R = np.random.uniform(R_min,R_max*0.3, image_G.size)

на это:

noise_R = np.random.uniform(R_min,R_max*0.1, image_R.size)
...