import cv2 import numpy as np from skimage.filters import gaussian from .helper import ( _motion_blur, shuffle_pixels_njit, clipped_zoom, gen_disk, gen_lensmask, ) def blur_gaussian(img, severity=1): """ Gaussian Blur. severity=[1, 2, 3, 4, 5] corresponding to sigma=[1, 2, 3, 4, 5]. 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] """ c = [1, 2, 3, 4, 5][severity - 1] img = np.array(img) / 255. img = gaussian(img, sigma=c, channel_axis=-1) img = np.clip(img, 0, 1) * 255 return img.round().astype(np.uint8) def blur_gaussian_lensmask(img, severity=1): """ Gaussian Blur with Lens Mask. severity=[1, 2, 3, 4, 5] corresponding to [gamma, sigma]=[[2.0, 2], [2.4, 4], [3.0, 6], [3.8, 8], [5.0, 10]]. severity mainly refer to PieAPP. @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 = [(2.0, 2), (2.4, 4), (3.0, 6), (3.8, 8), (5.0, 10)][severity - 1] img_orig = np.array(img) / 255. h, w = img.shape[:2] mask = gen_lensmask(h, w, gamma=c[0])[:, :, None] img = gaussian(img_orig, sigma=c[1], channel_axis=-1) img = mask * img_orig + (1 - mask) * img img = np.clip(img, 0, 1) * 255 return img.round().astype(np.uint8) def blur_motion(img, severity=1): """ Motion Blur. severity = [1, 2, 3, 4, 5] corresponding to radius=[5, 10, 15, 15, 20] and sigma=[1, 2, 3, 4, 5]. severity mainly refer to Imagecorruptions. @param img: Input image, H x W x 3, value range [0, 255] @param severity: Severity of distortion, [0, 5] @return: Degraded image, H x W x 3, value range [0, 255] """ c = [(5, 3), (10, 5), (15, 7), (15, 9), (20, 12)][severity - 1] angle = np.random.uniform(-90, 90) img = np.array(img) img = _motion_blur(img, radius=c[0], sigma=c[1], angle=angle) img = np.clip(img, 0, 255) return img.round().astype(np.uint8) def blur_glass(img, severity=1): """ Glass Blur. severity = [1, 2, 3, 4, 5] corresponding to [sigma, shift, iteration]=[(0.7, 1, 1), (0.9, 2, 1), (1.2, 2, 2), (1.4, 3, 2), (1.6, 4, 2)]. severity mainly refer to Imagecorruptions. @param img: Input image, H x W x 3, value range [0, 255] @param severity: Severity of distortion, [0, 5] @return: Degraded image, H x W x 3, value range [0, 255] """ c = [(0.7, 1, 1), (0.9, 2, 1), (1.2, 2, 2), (1.4, 3, 2), (1.6, 4, 2)][severity - 1] img = np.array(img) / 255. img = gaussian(img, sigma=c[0], channel_axis=-1) img = shuffle_pixels_njit(img, shift=c[1], iteration=c[2]) img = np.clip(gaussian(img, sigma=c[0], channel_axis=-1), 0, 1) * 255 return img.round().astype(np.uint8) def blur_lens(img, severity=1): """ Lens Blur. severity = [1, 2, 3, 4, 5] corresponding to radius=[2, 3, 4, 6, 8]. severity mainly refer to KADID-10K. @param img: Input image, H x W x 3, value range [0, 255] @param severity: Severity of distortion, [0, 5] @return: Degraded image, H x W x 3, value range [0, 255] """ c = [2, 3, 4, 6, 8][severity - 1] img = np.array(img) / 255. kernel = gen_disk(radius=c) img_lq = [] for i in range(3): img_lq.append(cv2.filter2D(img[:, :, i], -1, kernel)) img_lq = np.array(img_lq).transpose((1, 2, 0)) img_lq = np.clip(img_lq, 0, 1) * 255 return img_lq.round().astype(np.uint8) def blur_zoom(img, severity=1): """ Zoom Blur. severity = [1, 2, 3, 4, 5] corresponding to radius= [np.arange(1, 1.03, 0.02), np.arange(1, 1.06, 0.02), np.arange(1, 1.10, 0.02), np.arange(1, 1.15, 0.02), np.arange(1, 1.21, 0.02)]. severity mainly refer to Imagecorruptions. @param img: Input image, H x W x 3, value range [0, 255] @param severity: Severity of distortion, [0, 5] @return: Degraded image, H x W x 3, value range [0, 255] """ c = [np.arange(1, 1.03, 0.02), np.arange(1, 1.06, 0.02), np.arange(1, 1.10, 0.02), np.arange(1, 1.15, 0.02), np.arange(1, 1.21, 0.02)][severity - 1] img = (np.array(img) / 255.).astype(np.float32) h, w = img.shape[:2] img_lq = np.zeros_like(img) for zoom_factor in c: zoom_layer = clipped_zoom(img, zoom_factor) img_lq += zoom_layer[:h, :w, :] img_lq = (img + img_lq) / (len(c) + 1) img_lq = np.clip(img_lq, 0, 1) * 255 return img_lq.round().astype(np.uint8) def blur_jitter(img, severity=1): """ Jitter Blur. severity = [1, 2, 3, 4, 5] corresponding to shift=[1, 2, 3, 4, 5]. severity mainly refer to KADID-10K. @param img: Input image, H x W x 3, value range [0, 255] @param severity: Severity of distortion, [0, 5] @return: Degraded image, H x W x 3, value range [0, 255] """ c = [1, 2, 3, 4, 5][severity - 1] img = np.array(img) img_lq = shuffle_pixels_njit(img, shift=c, iteration=1) return np.uint8(img_lq)