File size: 4,446 Bytes
af44a4b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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.)