"""
Фильтры сглаживания изображений.
Автор: Беззаборов А.А.
"""
import cv2 as cv
import numpy as np
from typing import Union, Tuple
from .base import FilterBase
[документация]
class MeanBlur(FilterBase):
"""
Усредняющий (боксовый) фильтр размытия.
Атрибуты
--------
kernel_size : int
Размер усредняющего ядра (должен быть нечетным и положительным).
"""
[документация]
def __init__(self, kernel_size: int) -> None:
"""
Инициализация усредняющего фильтра.
Параметры
---------
kernel_size : int
Размер усредняющего ядра (должен быть нечетным и положительным).
"""
if kernel_size <= 0 or kernel_size % 2 == 0:
raise ValueError("Размер ядра должен быть положительным нечетным числом")
super().__init__(kernel_size, 'blur')
self.kernel_size = kernel_size
[документация]
def description(self) -> str:
"""Выдает название смаза с параметром."""
return f"|meanblur_{self.kernel_size}"
[документация]
def filter(self, image: np.ndarray) -> np.ndarray:
"""
Применить усредняющее размытие к изображению.
Параметры
---------
image : np.ndarray
Входное изображение (в градациях серого или цветное).
Возвращает
----------
np.ndarray
Размытое изображение.
"""
return cv.blur(image, (self.kernel_size, self.kernel_size))
[документация]
class GaussianBlur(FilterBase):
"""
Гауссовский фильтр размытия.
Атрибуты
--------
kernel_size : int
Размер гауссовского ядра (должен быть нечетным и положительным).
std : float
Стандартное отклонение (0 для автоматического расчета).
"""
[документация]
def __init__(self, params: Union[int, Tuple[int, float]]) -> None:
"""
Инициализация гауссовского фильтра.
Параметры
---------
params : Union[int, Tuple[int, float]]
kernel_size или (kernel_size, std).
"""
if isinstance(params, int):
kernel_size = params
std = 0
else:
kernel_size, std = params
if kernel_size <= 0 or kernel_size % 2 == 0:
raise ValueError("Размер ядра должен быть положительным нечетным числом")
super().__init__(params, 'blur')
self.kernel_size = kernel_size
self.std = std
[документация]
def description(self) -> str:
"""Выдает название смаза с параметром."""
return f"|gaussianblur_{self.kernel_size}_{self.std}"
[документация]
def filter(self, img: np.ndarray) -> np.ndarray:
"""Применить гауссовское размытие к изображению."""
return cv.GaussianBlur(img, (self.kernel_size, self.kernel_size), self.std)
[документация]
class BilateralFilter(FilterBase):
"""
Билатеральный фильтр (с сохранением границ).
Атрибуты
--------
d : int
Диаметр окрестности пикселя.
sigma_color : float
Сигма фильтр в цветовом пространстве.
sigma_space : float
Сигма фильтр в координатном пространстве.
"""
[документация]
def __init__(self, params: Union[int, Tuple[int, float, float]]):
"""
Инициализация билатерального фильтра.
Параметры
---------
params : Union[int, Tuple[int, float, float]]
d или (d, sigma_color, sigma_space).
"""
if isinstance(params, int):
d = params
sigma_color = sigma_space = 75
else:
d, sigma_color, sigma_space = params
super().__init__(params, 'blur')
self.d = d
self.sigma_color = sigma_color
self.sigma_space = sigma_space
[документация]
def description(self) -> str:
"""Выдает название смаза с параметром."""
return f"|bilateralfilter_{self.d}_{self.sigma_color}_{self.sigma_space}"
[документация]
def filter(self, img: np.ndarray) -> np.ndarray:
"""Применение билатерального фильтра к изображению."""
return cv.bilateralFilter(img, self.d, self.sigma_color, self.sigma_space)