lzyhha
init
319886d
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)