Spaces:
Running
on
Zero
Running
on
Zero
import cv2 | |
import numpy as np | |
import skimage as sk | |
def noise_gaussian_RGB(img, severity=1): | |
""" | |
Additive Gaussian noise in RGB channels. | |
severity=[1, 2, 3, 4, 5] is corresponding to sigma=[0.05, 0.1, 0.15, 0.2, 0.25]. | |
severity mainly refer to KADID-10K and Imagecorruptions. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
sigma = [0.05, 0.1, 0.15, 0.2, 0.25][severity-1] | |
img = np.array(img) / 255. | |
noise = np.random.normal(0, sigma, img.shape) | |
img_lq = img + noise | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |
def noise_gaussian_YCrCb(img, severity=1): | |
""" | |
Additive Gaussian noise with higher noise in color channels. | |
severity=[1, 2, 3, 4, 5] is corresponding to | |
sigma_l=[0.05, 0.06, 0.07, 0.08, 0.09], | |
sigma_r=[1, 1.45, 1.9, 2.35, 2.8], | |
sigma_b=[1, 1.45, 1.9, 2.35, 2.8]. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
sigma_l = [0.05, 0.06, 0.07, 0.08, 0.09][severity-1] | |
sigma_r = sigma_l * [1, 1.45, 1.9, 2.35, 2.8][severity - 1] | |
sigma_b = sigma_l * [1, 1.45, 1.9, 2.35, 2.8][severity - 1] | |
h, w = img.shape[:2] | |
img = np.float32(np.array(img) / 255.) | |
img = cv2.cvtColor(img, cv2.COLOR_RGB2YCR_CB) | |
noise_l = np.expand_dims(np.random.normal(0, sigma_l, (h, w)), 2) | |
noise_r = np.expand_dims(np.random.normal(0, sigma_r, (h, w)), 2) | |
noise_b = np.expand_dims(np.random.normal(0, sigma_b, (h, w)), 2) | |
noise = np.concatenate((noise_l, noise_r, noise_b), axis=2) | |
img_lq = np.float32(img + noise) | |
img_lq = cv2.cvtColor(img_lq, cv2.COLOR_YCR_CB2RGB) | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |
def noise_speckle(img, severity=1): | |
""" | |
Multiplicative Gaussian noise. | |
severity=[1, 2, 3, 4, 5] is corresponding to sigma=[0.14, 0.21, 0.28, 0.35, 0.42]. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
c = [0.14, 0.21, 0.28, 0.35, 0.42][severity - 1] | |
img = np.array(img) / 255. | |
noise = img * np.random.normal(size=img.shape, scale=c) | |
img_lq = img + noise | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |
def noise_spatially_correlated(img, severity=1): | |
""" | |
Spatially correlated noise. | |
severity=[1, 2, 3, 4, 5] is corresponding to sigma=[0.08, 0.11, 0.14, 0.18, 0.22]. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
sigma = [0.08, 0.11, 0.14, 0.18, 0.22][severity - 1] | |
img = np.array(img) / 255. | |
noise = np.random.normal(0, sigma, img.shape) | |
img_lq = img + noise | |
img_lq = cv2.blur(img_lq, [3, 3]) | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |
def noise_poisson(img, severity=1): | |
""" | |
Poisson noise. | |
PieAPP keeps this distortion free of additional parameters. | |
The default: | |
c = vals = len(np.unique(image)) | |
vals = 2 ** np.ceil(np.log2(vals)) | |
But Imagecorruptions introduces a extra parameter c | |
ranging [60, 25, 12, 5, 3] for sigma = sqrt(I / c). | |
severity=[1, 2, 3, 4, 5] is corresponding to c=[80, 60, 40, 25, 15]. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
c = [80, 60, 40, 25, 15][severity - 1] | |
img = np.array(img) / 255. | |
img_lq = np.random.poisson(img * c) / float(c) | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |
def noise_impulse(img, severity=1): | |
""" | |
Impulse noise is also known as salt&pepper noise. | |
PieAPP introduce the range [1e-4, 0.045]. | |
severity=[1, 2, 3, 4, 5] is corresponding to amount=[0.01, 0.03, 0.05, 0.07, 0.10]. | |
@param img: Input image, H x W x 3, value range [0, 255] | |
@param severity: Severity of distortion, [1, 5] | |
@return: Degraded image, H x W x 3, value range [0, 255] | |
""" | |
c = [0.01, 0.03, 0.05, 0.07, 0.10][severity - 1] | |
img = np.array(img) / 255. | |
img_lq = sk.util.random_noise(img, mode='s&p', amount=c) | |
return np.uint8(np.clip(img_lq, 0, 1) * 255.) | |