"""
Модуль загрузки изображений из директории в фреймворк.
Возможности:
- Загрузить все изображения из директории.
- Загрузить одно изображение по заданному пути.
- Загрузить связь из оригинального, смазанного изображения и ядра.
- Сохранить связи из фреймворка в файл.
- Загрузить связи в фреймворк из файла.
Авторы: Юров П.И., Беззаборов А.А.
"""
import numpy as np
import os
import json
from pathlib import Path
from typing import Optional, Any
from .utils import (
Image,
imread,
calculate_metrics
)
[документация]
class ModuleReader:
"""
Модуль загрузки изображений из директории в фреймворк.
Возможности:
- Загрузить все изображения из директории.
- Загрузить одно изображение по заданному пути.
- Загрузить связь из оригинального, смазанного изображения и ядра.
- Сохранить связи из фреймворка в файл.
- Загрузить связи в фреймворк из файла.
"""
[документация]
def __init__(self, processing_instance: Any) -> None:
"""
Инициализация.
Параметры
---------
processing_instance : Any
Ссылка на объект Processing с изображениями.
"""
self.processing = processing_instance
[документация]
def read_all(self) -> None:
"""Загрузка всех изображений из директории."""
for image_file in self.processing.folder_path.iterdir():
if image_file.is_file():
self._load_image(image_file)
[документация]
def read_one(self, path: Path) -> None:
"""Загрузка одного изображения."""
image_path = self.processing.folder_path / path
self._load_image(image_path)
def _load_image(self, image_path: str) -> None:
"""Внутренний метод загрузки изображения."""
image = imread(str(image_path), self.processing.color)
if image is not None:
self.processing.images = np.append(self.processing.images,
Image(
str(image_path),
self.processing.color))
[документация]
def bind(self,
original_image_path: Path,
blurred_image_path: Path,
original_kernel_path: Optional[Path] = None,
filter_description: str = "unknown",
color: bool = True) -> Image:
"""
Связывает оригинальное изображение с искаженной версией.
Параметры
---------
original_image_path : Path
Путь к оригинальному изображению.
blurred_image_path : Path
Путь к смазанному изображению.
original_kernel_path : Optional[Path]
Путь к ядру размытия.
filter_description : str
Описание примененного фильтра.
color : bool
Способ загрузки (True - цветное, False - ч/б).
Возвращает
----------
Image
Объект связи изображений.
"""
if color is None:
color = self.processing.color
if not all(os.path.exists(p) for p in [original_image_path, blurred_image_path] if p):
missing = [p for p in [original_image_path, blurred_image_path] if p and not os.path.exists(p)]
raise FileNotFoundError(f"Files not found: {missing}")
original = imread(original_image_path, color)
blurred = imread(blurred_image_path, color)
if original is None:
raise ValueError(f"Failed to load original image: {original_image_path}")
if blurred is None:
raise ValueError(f"Failed to load blurred image: {blurred_image_path}")
img_obj = Image(original_image_path, color)
img_obj.set_blurred(blurred_image_path)
img_obj.set_current_filter(filter_description)
# ing_obj.add_fil
psnr_blured, ssim_blured = calculate_metrics(original, blurred, data_range=1.0)
img_obj.add_blurred_PSNR(psnr_blured,str(blurred_image_path))
img_obj.add_blurred_SSIM(ssim_blured,str(blurred_image_path))
if original_kernel_path:
if not os.path.exists(original_kernel_path):
print(f"Kernel not found: {original_kernel_path}")
else:
img_obj.add_original_kernel(str(original_kernel_path), str(blurred_image_path))
self.processing.images = np.append(self.processing.images, img_obj)
return img_obj
[документация]
def save_bind_state(self, file_path: Optional[Path] = None) -> None:
"""Сохраняет состояние связей в JSON файл."""
if file_path is None:
file_path = os.path.join(self.processing.dataset_path, 'dataset.json')
data = dict()
counter = 1
self.processing.save_filter()
for img in self.processing.images:
data[f'{counter}'] = {}
original_path = img.get_original()
restored_kernels = img.get_kernels() #(bl_p , alg_p)
original_kernels = img.get_original_kernels() #bl_p
blurred_ssim = img.get_blurred_SSIM() #bl_p
blurred_psnr = img.get_blurred_PSNR() #bl_p
filters = img.get_filters() #bl_p
algorithms = img.get_algorithm() #array
restored_psnr = img.get_PSNR() #(bl_p,alg_p)
restored_ssim = img.get_SSIM() #(bl_p,alg_p)
is_color = img.get_color() #Bool
restored_path = img.get_restored() #(bl_p,alg_p)
for blurred_path in img.get_blurred_array():
tmp_dict = dict()
tmp_dict['original_path'] = original_path
tmp_dict['blurred_path'] = blurred_path
tmp_dict['original_kernel'] = original_kernels[blurred_path]
tmp_dict['filters'] = filters[blurred_path]
tmp_dict['blurred_psnr'] = blurred_psnr[blurred_path]
tmp_dict['blurred_ssim'] = blurred_ssim[blurred_path]
tmp_dict['is_color'] = is_color
tmp_dict['restored_paths'] = dict()
tmp_dict['algorithm'] = algorithms.tolist()
tmp_dict['kernel_paths'] = dict()
tmp_dict['psnr'] = dict()
tmp_dict['ssim'] = dict()
for alg in algorithms:
tmp_dict['restored_paths'][alg] = restored_path[(blurred_path,alg)]
tmp_dict['kernel_paths'][alg] = restored_kernels[(blurred_path,alg)]
tmp_dict['psnr'][alg] = restored_psnr[(blurred_path,alg)]
tmp_dict['ssim'][alg] = restored_ssim[(blurred_path,alg)]
data[f'{counter}'] = tmp_dict
counter+=1
with open(file_path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
pass
[документация]
def load_bind_state(self, bind_path: Path) -> None:
"""Загружает состояние связей из JSON файла."""
with open(bind_path, 'r', encoding='utf-8') as f:
data_global = json.load(f)
for i in data_global.keys():
data = data_global[i]
original_path = data['original_path']
blurred_path = data['blurred_path']
original_kernels = {blurred_path: data['original_kernel']}
filters = data['filters']
blurred_psnr = {blurred_path: data['blurred_psnr']}
blurred_ssim = {blurred_path: data['blurred_ssim']}
is_color = data['is_color']
restored_paths = dict()
algorithms = np.array(data['algorithm'])
kernel_paths = dict()
psnr = dict()
ssim = dict()
tmp_image = Image(original_path,is_color)
for alg in algorithms:
restored_paths[(blurred_path,alg)] = data['restored_paths'][alg]
kernel_paths[(blurred_path,alg)] = data['kernel_paths'][alg]
psnr[(blurred_path,alg)] = data['psnr'][alg]
ssim[(blurred_path,alg)] = data['ssim'][alg]
tmp_image.set_blurred(blurred_path)
tmp_image.set_blurred_PSNR(blurred_psnr)
tmp_image.set_blurred_SSIM(blurred_ssim)
tmp_image.set_current_filter(filters)
tmp_image.set_original_kernels(original_kernels)
tmp_image.set_restored(restored_paths)
tmp_image.set_algorithm(algorithms)
tmp_image.set_PSNR(psnr)
tmp_image.set_SSIM(ssim)
tmp_image.set_kernels(kernel_paths)
self.processing.images = np.append(self.processing.images, tmp_image)