Skip to content
Snippets Groups Projects
Commit d2bf1855 authored by Mathieu Beligon's avatar Mathieu Beligon
Browse files

Merge branch 'robots-at-runes/image-perturbations-2' into 'master'

WIP[robots-at-runes](perturbations) fonction de perturbations

See merge request polystar/robomaster/computer-vision/code!8
parents 74a7ea08 6053cfcf
No related branches found
No related tags found
No related merge requests found
Showing
with 190 additions and 0 deletions
import numpy as np
from polystar.common.models.image import Image
def brightness(image: Image, intensity: float) -> Image:
MAX_BETA = 10
beta = MAX_BETA * intensity
perturbed_image = np.clip((image.astype(np.uint16) + beta), 0, 255).astype(np.uint8)
return perturbed_image
if __name__ == "__main__":
from research.dataset.perturbations.utils import simple_perturbator_test
simple_perturbator_test(brightness)
import numpy as np
from polystar.common.models.image import Image
def contrast(image: Image, intensity: float) -> Image:
ALPHA_FACTOR = 0.7
MIN_ALPHA = 0.8
alpha = MIN_ALPHA + ALPHA_FACTOR * intensity
perturbed_image = np.clip((image.astype(np.uint16) * alpha), 0, 255).astype(np.uint8)
return perturbed_image
if __name__ == "__main__":
from research.dataset.perturbations.utils import simple_perturbator_test
simple_perturbator_test(contrast)
/res_*.png
\ No newline at end of file
robots-at-runes/research/dataset/perturbations/examples/test.png

1.62 MiB

import cv2
from polystar.common.models.image import Image
def to_odd_number(number):
return int(number // 2 * 2) - 1
def gaussian_blur(image: Image, intensity: float) -> Image:
MAX_FACTOR = 0.015
blur_factor = intensity * MAX_FACTOR
width = image.shape[0]
height = image.shape[1]
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
if __name__ == "__main__":
from research.dataset.perturbations.utils import simple_perturbator_test
simple_perturbator_test(gaussian_blur)
import numpy as np
from polystar.common.models.image import Image
def gaussian_noise(image: Image, intensity: float) -> Image:
MAX_VARIANCE = 300
mean = 0
variance = MAX_VARIANCE * intensity
sigma = variance ** 0.5
row, column, ch = image.shape
gaussian = np.random.normal(mean, 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_perturbator_test
simple_perturbator_test(gaussian_noise)
import cv2
import numpy as np
from polystar.common.models.image import Image
def horizontal_blur(image: Image, intensity: float) -> Image:
MAX_KERNEL_SIZE = 11
kernel_size = int(MAX_KERNEL_SIZE * intensity) + 1
# Fill kernel with zeros
kernel_horizontal = np.zeros((kernel_size, kernel_size))
# Fill middle row with ones
kernel_horizontal[int(abs(kernel_size - 1) / 2), :] = np.ones(kernel_size)
# Normalize
kernel_horizontal /= kernel_size
return cv2.filter2D(image, -1, kernel_horizontal)
if __name__ == "__main__":
from research.dataset.perturbations.utils import simple_perturbator_test
simple_perturbator_test(horizontal_blur)
from dataclasses import dataclass
from pathlib import Path
from random import shuffle
from typing import List, Callable
import cv2
import matplotlib.pyplot as plt
import numpy as np
from polystar.common.models.image import Image
from research.dataset.perturbations.contrast import contrast
from research.dataset.perturbations.gaussian_blur import gaussian_blur
from research.dataset.perturbations.gaussian_noise import gaussian_noise
from research.dataset.perturbations.horizontal_blur import horizontal_blur
@dataclass
class ImagePerturbator:
perturbator_functions: List[Callable[[Image, float], Image]]
def perturbate(self, image: Image) -> Image:
shuffle(self.perturbator_functions)
intensities = self._generate_intensities()
for perturbator_function, intensity in zip(self.perturbator_functions, intensities):
image = perturbator_function(image, intensity)
return image
def _generate_intensities(self) -> List[float]:
intensities = np.random.random(len(self.perturbator_functions))
return intensities / intensities.sum()
if __name__ == "__main__":
EXAMPLE_DIR = Path(__file__).parent / "examples"
rune_img = Image.from_path(EXAMPLE_DIR / "test.png")
perturbator = ImagePerturbator([contrast, gaussian_blur, gaussian_noise, horizontal_blur])
rune_perturbed = perturbator.perturbate(rune_img)
cv2.imwrite(str(EXAMPLE_DIR / "res_full_pipeline.png"), cv2.cvtColor(rune_perturbed, cv2.COLOR_RGB2BGR))
plt.axis("off")
plt.tight_layout()
plt.imshow(rune_perturbed)
plt.show()
import numpy as np
import cv2
from polystar.common.models.image import Image
def saturation(image: Image, intensity: float) -> Image:
MAX_SATURATION = 0.6
saturation_factor = 1 + 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_perturbator_test
simple_perturbator_test(saturation)
from collections import Callable
from pathlib import Path
import cv2
import matplotlib.pyplot as plt
import numpy as np
from polystar.common.models.image import Image
EXAMPLE_DIR = Path(__file__).parent / "examples"
def simple_perturbator_test(perturbator_function: Callable):
rune_img = Image.from_path(EXAMPLE_DIR / "test.png")
rune_perturbed = perturbator_function(rune_img, 1)
cv2.imwrite(
str(EXAMPLE_DIR / f"res_{perturbator_function.__name__}.png"), cv2.cvtColor(rune_perturbed, cv2.COLOR_RGB2BGR)
)
side_by_side_display = np.hstack((rune_img, rune_perturbed))
h, w, _ = rune_img.shape
plt.figure(figsize=(12, 6 * h / w))
plt.axis("off")
plt.tight_layout()
plt.imshow(side_by_side_display)
plt.show()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment