简体   繁体   中英

How to change noise color in an image?

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:

在此处输入图片说明

import cv2
import numpy as np

# load image and get dimensions
img = cv2.imread("zelda1.jpg")
hh, ww = img.shape[:2]

# create noise image (multiplier increase noise in result)
noise = (800*np.random.random((hh,ww))).clip(0,255).astype(np.uint8)

# make blue image
blue = np.full_like(img, (255,0,0))

# combine img and blue using noise as mask
img_masked = cv2.bitwise_and(img, img, mask=255-noise)
blue_masked = cv2.bitwise_and(blue, blue, mask=noise)
result = cv2.add(img_masked, blue_masked)
    
# write result to disk
cv2.imwrite("noise.jpg", noise)
cv2.imwrite("blue.jpg", blue)
cv2.imwrite("zelda1_blue_noise.jpg", result)

# display it
cv2.imshow("noise", noise)
cv2.imshow("blue", blue)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Noise image:

在此处输入图片说明

Blue image:

在此处输入图片说明

Result:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM