class HorizontalBlurrer(ImageModifierABC): max_kernel_size: int = 11 def modify(self, image: Image, intensity: float) -> Image: kernel = self._make_zero_kernel(intensity) self._fill_middle_row_with_ones(kernel) self._normalize_kernel(kernel) return self._apply_kernel(image, kernel) def _make_zero_kernel(self, intensity: float) -> np.ndarray: kernel_size = int(self.max_kernel_size * intensity) + 1 return np.zeros((kernel_size, kernel_size)) @staticmethod def _fill_middle_row_with_ones(kernel: np.ndarray): kernel[len(kernel) // 2, :] = 1 @staticmethod def _normalize_kernel(kernel: np.ndarray): kernel /= len(kernel) @staticmethod def _apply_kernel(image: Image, kernel: np.ndarray) -> Image: return cv2.filter2D(image, -1, kernel) if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(HorizontalBlurrer())
from dataclasses import dataclass import cv2 from polystar.models.image import Image from research.dataset.perturbations.image_modifiers.image_modifier_abc import ImageModifierABC @dataclass class GaussianBlurrer(ImageModifierABC): max_factor: float = 0.015 def modify(self, image: Image, intensity: float) -> Image: blur_factor = intensity * self.max_factor width, height, *_ = image.shape x, y = _to_odd_number(width * blur_factor), _to_odd_number(height * blur_factor) image = cv2.GaussianBlur(image, (x, y), cv2.BORDER_DEFAULT) return image def _to_odd_number(number): return int(number // 2 * 2) - 1 if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(GaussianBlurrer())
from dataclasses import dataclass import numpy as np from polystar.models.image import Image from research.dataset.perturbations.image_modifiers.image_modifier_abc import ImageModifierABC @dataclass class BrightnessModifier(ImageModifierABC): max_offset: float = 10.0 def modify(self, image: Image, intensity: float) -> Image: offset = self.max_offset * intensity perturbed_image = np.clip((image.astype(np.uint16) + offset), 0, 255).astype(np.uint8) return perturbed_image if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(BrightnessModifier())
from dataclasses import dataclass import numpy as np from polystar.models.image import Image from research.dataset.perturbations.image_modifiers.image_modifier_abc import ImageModifierABC @dataclass class ContrastModifier(ImageModifierABC): min_coef: float = 0.8 max_coef: float = 1.5 def modify(self, image: Image, intensity: float) -> Image: coef = self.min_coef + (self.max_coef - self.min_coef) * intensity perturbed_image = np.clip((image.astype(np.uint16) * coef), 0, 255).astype(np.uint8) return perturbed_image if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(ContrastModifier())
from dataclasses import dataclass import cv2 import numpy as np from polystar.models.image import Image from research.dataset.perturbations.image_modifiers.image_modifier_abc import ImageModifierABC @dataclass class SaturationModifier(ImageModifierABC): max_saturation: float = 0.6 def modify(self, image: Image, intensity: float) -> Image: saturation_factor = 1 + self.max_saturation * intensity image_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV) (h, s, v) = cv2.split(image_hsv) new_s = np.clip((s.astype(np.uint16) * saturation_factor), 0, 255).astype(np.uint8) new_image_hsv = cv2.merge([h, new_s, v]) image_rgb = cv2.cvtColor(new_image_hsv, cv2.COLOR_HSV2RGB).astype(np.uint8) return image_rgb if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(SaturationModifier())
from dataclasses import dataclass import numpy as np from polystar.models.image import Image from research.dataset.perturbations.image_modifiers.image_modifier_abc import ImageModifierABC @dataclass class GaussianNoiser(ImageModifierABC): max_variance: float = 300.0 def modify(self, image: Image, intensity: float) -> Image: variance = self.max_variance * intensity sigma = variance**0.5 row, column, ch = image.shape gaussian = np.random.normal(0, sigma, (row, column, ch)) perturbed_image = np.clip((image.astype(np.uint16) + gaussian), 0, 255).astype(np.uint8) return perturbed_image if __name__ == "__main__": from research.dataset.perturbations.utils import simple_modifier_demo simple_modifier_demo(GaussianNoiser())