ICDR / utils /degradation_utils.py
Siwon123's picture
q
7f43945
import torch
from torchvision.transforms import ToPILImage, Compose, RandomCrop, ToTensor, Grayscale
from PIL import Image
import random
import numpy as np
from utils.image_utils import crop_img
class Degradation(object):
def __init__(self, args):
super(Degradation, self).__init__()
self.args = args
self.toTensor = ToTensor()
self.crop_transform = Compose([
ToPILImage(),
RandomCrop(args.patch_size),
])
def _add_gaussian_noise(self, clean_patch, sigma):
# noise = torch.randn(*(clean_patch.shape))
# clean_patch = self.toTensor(clean_patch)
noise = np.random.randn(*clean_patch.shape)
noisy_patch = np.clip(clean_patch + noise * sigma, 0, 255).astype(np.uint8)
# noisy_patch = torch.clamp(clean_patch + noise * sigma, 0, 255).type(torch.int32)
return noisy_patch, clean_patch
def _degrade_by_type(self, clean_patch, degrade_type):
if degrade_type == 0:
# denoise sigma=15
degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=15)
elif degrade_type == 1:
# denoise sigma=25
degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=25)
elif degrade_type == 2:
# denoise sigma=50
degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=50)
return degraded_patch, clean_patch
def degrade(self, clean_patch_1, clean_patch_2, degrade_type=None):
if degrade_type == None:
degrade_type = random.randint(0, 3)
else:
degrade_type = degrade_type
degrad_patch_1, _ = self._degrade_by_type(clean_patch_1, degrade_type)
degrad_patch_2, _ = self._degrade_by_type(clean_patch_2, degrade_type)
return degrad_patch_1, degrad_patch_2