|
|
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 = np.random.randn(*clean_patch.shape)
|
|
|
noisy_patch = np.clip(clean_patch + noise * sigma, 0, 255).astype(np.uint8)
|
|
|
|
|
|
return noisy_patch, clean_patch
|
|
|
|
|
|
def _degrade_by_type(self, clean_patch, degrade_type):
|
|
|
if degrade_type == 0:
|
|
|
|
|
|
degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=15)
|
|
|
elif degrade_type == 1:
|
|
|
|
|
|
degraded_patch, clean_patch = self._add_gaussian_noise(clean_patch, sigma=25)
|
|
|
elif degrade_type == 2:
|
|
|
|
|
|
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
|
|
|
|
|
|
def single_degrade(self,clean_patch,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, degrade_type)
|
|
|
return degrad_patch_1
|
|
|
|