Spaces:
Runtime error
Runtime error
| import numpy as np | |
| import cv2 | |
| import random | |
| from PIL import Image | |
| from degradation_toolkit.add_degradation_various import * | |
| from degradation_toolkit.image_operators import * | |
| from degradation_toolkit.x_distortion import * | |
| degradation_list1 = [ | |
| 'blur', | |
| 'noise', | |
| 'compression', | |
| 'brighten', | |
| 'darken', | |
| 'spatter', | |
| 'contrast_strengthen', | |
| 'contrast_weaken', | |
| 'saturate_strengthen', | |
| 'saturate_weaken', | |
| 'oversharpen', | |
| 'pixelate', | |
| 'quantization', | |
| ] | |
| degradation_list2 = [ | |
| 'Rain', | |
| 'Ringing', | |
| 'r_l', | |
| 'Inpainting', | |
| 'mosaic', | |
| 'SRx2', | |
| 'SRx4', | |
| 'GaussianNoise', | |
| 'GaussianBlur', | |
| 'JPEG', | |
| 'Resize', | |
| 'SPNoise', | |
| 'LowLight', | |
| 'PoissonNoise', | |
| 'gray', | |
| 'ColorDistortion', | |
| ] | |
| degradation_list3 = [ | |
| 'Laplacian', | |
| 'Canny', | |
| 'Sobel', | |
| 'Defocus', | |
| 'Mosaic', | |
| 'Barrel', | |
| 'Pincushion', | |
| 'Spatter', | |
| 'Elastic', | |
| 'Frost', | |
| 'Contrast', | |
| ] | |
| degradation_list4 = [ | |
| 'flip', | |
| 'rotate90', | |
| 'rotate180', | |
| 'rotate270', | |
| 'identity', | |
| ] | |
| all_degradation_types = degradation_list1 + degradation_list2 + degradation_list3 + degradation_list4 | |
| def single2uint(img): | |
| return np.uint8((img.clip(0, 1) * 255.0).round()) | |
| def uint2single(img): | |
| return np.float32(img / 255.0) | |
| def add_x_distortion_single_images(img_gt1, deg_type): | |
| # np.uint8, BGR | |
| x_distortion_dict = distortions_dict | |
| severity = random.choice([1, 2, 3, 4, 5]) | |
| if deg_type == 'compression' or deg_type == "quantization": | |
| severity = min(3, severity) | |
| deg_type = random.choice(x_distortion_dict[deg_type]) | |
| img_gt1 = cv2.cvtColor(img_gt1, cv2.COLOR_BGR2RGB) | |
| img_lq1 = globals()[deg_type](img_gt1, severity) | |
| img_gt1 = cv2.cvtColor(img_gt1, cv2.COLOR_RGB2BGR) | |
| img_lq1 = cv2.cvtColor(img_lq1, cv2.COLOR_RGB2BGR) | |
| return img_lq1, img_gt1, deg_type | |
| def add_degradation_single_images(img_gt1, deg_type): | |
| if deg_type == 'Rain': | |
| value = random.uniform(40, 200) | |
| img_lq1 = add_rain(img_gt1, value=value) | |
| elif deg_type == 'Ringing': | |
| img_lq1 = add_ringing(img_gt1) | |
| elif deg_type == 'r_l': | |
| img_lq1 = r_l(img_gt1) | |
| elif deg_type == 'Inpainting': | |
| l_num = random.randint(20, 50) | |
| l_thick = random.randint(10, 20) | |
| img_lq1 = inpainting(img_gt1, l_num=l_num, l_thick=l_thick) | |
| elif deg_type == 'mosaic': | |
| img_lq1 = mosaic_CFA_Bayer(img_gt1) | |
| elif deg_type == 'SRx2': | |
| H, W, _ = img_gt1.shape | |
| img_lq1 = cv2.resize(img_gt1, (W//2, H//2), interpolation=cv2.INTER_CUBIC) | |
| img_lq1 = cv2.resize(img_lq1, (W, H), interpolation=cv2.INTER_CUBIC) | |
| elif deg_type == 'SRx4': | |
| H, W, _ = img_gt1.shape | |
| img_lq1 = cv2.resize(img_gt1, (W//4, H//4), interpolation=cv2.INTER_CUBIC) | |
| img_lq1 = cv2.resize(img_lq1, (W, H), interpolation=cv2.INTER_CUBIC) | |
| elif deg_type == 'GaussianNoise': | |
| level = random.uniform(10, 50) | |
| img_lq1 = add_Gaussian_noise(img_gt1, level=level) | |
| elif deg_type == 'GaussianBlur': | |
| sigma = random.uniform(2, 4) | |
| img_lq1 = iso_GaussianBlur(img_gt1, window=15, sigma=sigma) | |
| elif deg_type == 'JPEG': | |
| level = random.randint(10, 40) | |
| img_lq1 = add_JPEG_noise(img_gt1, level=level) | |
| elif deg_type == 'Resize': | |
| img_lq1 = add_resize(img_gt1) | |
| elif deg_type == 'SPNoise': | |
| img_lq1 = add_sp_noise(img_gt1) | |
| elif deg_type == 'LowLight': | |
| lum_scale = random.uniform(0.3, 0.4) | |
| img_lq1 = low_light(img_gt1, lum_scale=lum_scale) | |
| elif deg_type == 'PoissonNoise': | |
| img_lq1 = add_Poisson_noise(img_gt1, level=2) | |
| elif deg_type == 'gray': | |
| img_lq1 = cv2.cvtColor(img_gt1, cv2.COLOR_BGR2GRAY) | |
| img_lq1 = np.expand_dims(img_lq1, axis=2) | |
| img_lq1 = np.concatenate((img_lq1, img_lq1, img_lq1), axis=2) | |
| elif deg_type == 'None': | |
| img_lq1 = img_gt1 | |
| elif deg_type == 'ColorDistortion': | |
| if random.random() < 0.5: | |
| channels = list(range(3)) | |
| random.shuffle(channels) | |
| img_lq1 = img_gt1[..., channels] | |
| else: | |
| channel = random.randint(0, 2) | |
| img_lq1 = img_gt1.copy() | |
| if random.random() < 0.5: | |
| img_lq1[..., channel] = 0 | |
| else: | |
| img_lq1[..., channel] = 1 | |
| else: | |
| print('Error!', '-', deg_type, '-') | |
| exit() | |
| img_lq1 = np.clip(img_lq1 * 255, 0, 255).round().astype(np.uint8) | |
| img_lq1 = img_lq1.astype(np.float32) / 255.0 | |
| img_gt1 = np.clip(img_gt1 * 255, 0, 255).round().astype(np.uint8) | |
| img_gt1 = img_gt1.astype(np.float32) / 255.0 | |
| return img_lq1, img_gt1 | |
| def calculate_operators_single_images(img_gt1, deg_type): | |
| img_gt1 = img_gt1.copy() | |
| if deg_type == 'Laplacian': | |
| img_lq1 = Laplacian_edge_detector(img_gt1) | |
| elif deg_type == 'Canny': | |
| img_lq1 = Canny_edge_detector(img_gt1) | |
| elif deg_type == 'Sobel': | |
| img_lq1 = Sobel_edge_detector(img_gt1) | |
| elif deg_type == 'Defocus': | |
| img_lq1 = defocus_blur(img_gt1, level=(3, 0.2)) | |
| elif deg_type == 'Mosaic': | |
| img_lq1 = mosaic_CFA_Bayer(img_gt1) | |
| elif deg_type == 'Barrel': | |
| img_lq1 = simulate_barrel_distortion(img_gt1, k1=0.1, k2=0.05) | |
| elif deg_type == 'Pincushion': | |
| img_lq1 = simulate_pincushion_distortion(img_gt1, k1=-0.1, k2=-0.05) | |
| elif deg_type == 'Spatter': | |
| img_lq1 = uint2single(spatter((img_gt1), severity=1)) | |
| elif deg_type == 'Elastic': | |
| img_lq1 = elastic_transform((img_gt1), severity=4) | |
| elif deg_type == 'Frost': | |
| img_lq1 = uint2single(frost(img_gt1, severity=4)) | |
| elif deg_type == 'Contrast': | |
| img_lq1 = adjust_contrast(img_gt1, clip_limit=4.0, tile_grid_size=(4, 4)) | |
| if np.mean(img_lq1).astype(np.float16) == 0: | |
| print(deg_type, 'prompt&query zero images.') | |
| img_lq1 = img_gt1.copy() | |
| return img_lq1, img_gt1 | |
| def add_degradation(image, deg_type): | |
| if deg_type in degradation_list1: | |
| list_idx = 1 | |
| img_lq1, _, _ = add_x_distortion_single_images(np.copy(image), deg_type) | |
| img_lq1 = uint2single(img_lq1) | |
| elif deg_type in degradation_list2: | |
| list_idx = 2 | |
| img_lq1, _ = add_degradation_single_images(np.copy(uint2single(image)), deg_type) | |
| elif deg_type in degradation_list3: | |
| list_idx = 3 | |
| if deg_type in ['Laplacian', 'Canny', 'Sobel', 'Frost']: | |
| img_lq1, _ = calculate_operators_single_images(np.copy(image), deg_type) | |
| else: | |
| img_lq1, _ = calculate_operators_single_images(np.copy(uint2single(image)), deg_type) | |
| if img_lq1.max() > 1: | |
| img_lq1 = uint2single(img_lq1) | |
| elif deg_type in degradation_list4: | |
| list_idx = 4 | |
| img_lq1 = np.copy(uint2single(image)) | |
| if deg_type == 'flip': | |
| img_lq1 = np.flip(img_lq1, axis=1) | |
| elif deg_type == 'rotate90': | |
| img_lq1 = np.rot90(img_lq1, k=1) | |
| elif deg_type == 'rotate180': | |
| img_lq1 = np.rot90(img_lq1, k=2) | |
| elif deg_type == 'rotate270': | |
| img_lq1 = np.rot90(img_lq1, k=3) | |
| elif deg_type == 'identity': | |
| pass | |
| return Image.fromarray(single2uint(img_lq1)), list_idx | |