|
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 |
|
|