I am trying to generate a noisy image as follows:
I have figured out how to generate the images with the random noise but can't figure out how to change the noises color.
import numpy as np
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('/home/pourya/face/os.jpg')[...,::-1]/255.0
noise = np.random.normal(loc=-1, scale=1, size=img.shape)
# noise overlaid over image
noisy = np.clip((img + noise*1.7),0,1)
noisy2 = np.clip((img + noise*1.6),0,1)
# noise multiplied by image:
# whites can go to black but blacks cannot go to white
noisy2mul = np.clip((img*(1 + noise*1.5)),0,1)
noisy4mul = np.clip((img*(1 + noise*1.4)),0,1)
noisy2mul = np.clip((img*(1 + noise*1.8)),0,1)
noisy4mul = np.clip((img*(1 + noise*1.7)),0,1)
# noise multiplied by bottom and top half images,
# whites stay white blacks black, noise is added to center
img2 = img*2
n2 = np.clip(np.where(img2 <= 1, (img2*(1 + noise*0.2)), (1-img2+1)*(1 + noise*0.2)*-1 + 2)/2, 0,1)
n4 = np.clip(np.where(img2 <= 1, (img2*(1 + noise*0.4)), (1-img2+1)*(1 + noise*0.4)*-1 + 2)/2, 0,1)
# norm noise for viz only
noise2 = (noise - noise.min())/(noise.max()-noise.min())
plt.figure(figsize=(20,20))
plt.imshow(np.vstack((np.hstack((img, noise2)),
np.hstack((noisy, noisy2)),
np.hstack((noisy2mul, noisy4mul)),
np.hstack((n2, n4)))))
plt.show()
plt.hist(noise.ravel(), bins=100)
plt.show()
With the above code I got the following result.
How can I generate single color noise similar to the first image?? Thank you
Here is one way to do that in Python/OpenCV. Create a grayscale noise image using numpy as a mask. Create a colored image. Do bitwise_and to combine omg and blue using the noise as a mask.
Input:
Noise image:
Blue image:
Result: