"""
Модуль предобработки смазанного изображения.
Возможности:
- Применить выравнивание гистограмм.
- Применить адаптивное выравнивание гистограмм.
- Обратить выравнивание гистограмм.
Автор: Юров П.И.
"""
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pathlib import Path
from typing import Any
from skimage.exposure import (
equalize_hist,
equalize_adapthist,
histogram,
match_histograms,
cumulative_distribution
)
from .utils import (
imread,
float_img_to_int,
prepare_image_for_metric,
calculate_metrics,
)
[документация]
class ModulePreprocessing:
"""
Модуль предобработки смазанного изображения.
Возможности:
- Применить выравнивание гистограмм.
- Применить адаптивное выравнивание гистограмм.
- Обратить выравнивание гистограмм.
"""
[документация]
def __init__(self, processing_instance: Any) -> None:
"""
Инициализация.
Параметры
---------
processing_instance : Any
Ссылка на объект Processing с изображениями.
"""
self.processing = processing_instance
[документация]
def histogram_equalization(self, view_histogram: bool = False) -> None:
"""Выполняет выравнивание гистограмм."""
for img_obj in self.processing.images:
blurred_path = img_obj.get_blurred()
if blurred_path is None:
self._copy_original_to_blurred(img_obj)
blurred_path = img_obj.get_blurred()
current_image = img_obj.get_blurred_image()
filtered_image = equalize_hist(current_image, nbins=256)
filtered_image = float_img_to_int(filtered_image)
original_filename = Path(img_obj.get_blurred()).name
new_path_preprocess = self.processing.preprocess_dir / f'{str(original_filename)}'
cv.imwrite(str(new_path_preprocess), filtered_image)
img_obj.add_preprocessed_blurred_path(blurred_path, new_path_preprocess)
if (view_histogram):
hist1 = histogram(current_image)
hist2 = histogram(filtered_image)
plt.figure(figsize=(12, 6))
plt.bar(hist1[1], hist1[0], alpha=0.5, color='blue')
plt.bar(hist2[1], hist2[0], alpha=0.5, color='red')
plt.grid(alpha=0.3)
plt.show()
cdf1 = cumulative_distribution(current_image)
cdf2 = cumulative_distribution(filtered_image)
plt.figure(figsize=(12, 6))
plt.plot(cdf1[0], cdf1[1], color='blue')
plt.plot(cdf2[0], cdf2[1], color='red')
plt.show()
[документация]
def histogram_equalization_CLAHE(self,
view_histogram: bool = False,
clip_limit: float = 0.01) -> None:
"""Выполняет адаптивное выравнивание гистограмм с ограничением контрастности."""
for img_obj in self.processing.images:
blurred_path = img_obj.get_blurred()
if blurred_path is None:
self._copy_original_to_blurred(img_obj)
blurred_path = img_obj.get_blurred()
current_image = img_obj.get_blurred_image()
filtered_image = equalize_adapthist(current_image,
nbins=256,
clip_limit=clip_limit)
filtered_image = float_img_to_int(filtered_image)
original_filename = Path(img_obj.get_blurred()).name
new_path_preprocess = self.processing.preprocess_dir / f'{str(original_filename)}'
cv.imwrite(str(new_path_preprocess), filtered_image)
img_obj.add_preprocessed_blurred_path(blurred_path, new_path_preprocess)
if (view_histogram):
hist1 = histogram(current_image)
hist2 = histogram(filtered_image)
plt.figure(figsize=(12, 6))
plt.bar(hist1[1], hist1[0], alpha=0.5, color='blue')
plt.bar(hist2[1], hist2[0], alpha=0.5, color='red')
plt.grid(alpha=0.3)
plt.show()
cdf1 = cumulative_distribution(current_image)
cdf2 = cumulative_distribution(filtered_image)
plt.figure(figsize=(12, 6))
plt.plot(cdf1[0], cdf1[1], color='blue')
plt.plot(cdf2[0], cdf2[1], color='red')
plt.show()
[документация]
def inverse_histogram_equalization(self, view_histogram: bool = False) -> None:
"""Обращает выравнивание гистограмм."""
for img_obj in self.processing.images:
blurred_path = img_obj.get_blurred()
preprocessed_image_paths = img_obj.get_preprocessed_blurred_path()
preprocessed_image_path = preprocessed_image_paths.get(blurred_path, None)
if preprocessed_image_path is None:
raise Exception('Image didn\'t preprocessed or Image not found')
current_image = imread(preprocessed_image_path, img_obj.get_color())
restored_array = img_obj.get_restored()
original_blurred_image = img_obj.get_blurred_image()
if original_blurred_image is None:
raise Exception("Оригинальное смазанное изображение не найдено")
filtered_image = self._inverse_histogram_equalization_one(current_image,
original_blurred_image,
view_histogram)
cv.imwrite(str(preprocessed_image_path), filtered_image)
original_image = img_obj.get_original_image()
original_image = prepare_image_for_metric(original_image)
for alg_name in img_obj.get_algorithm():
current_image_path = restored_array[(blurred_path, alg_name)]
current_image = imread(current_image_path, img_obj.get_color())
filtered_image = self._inverse_histogram_equalization_one(current_image,
original_blurred_image,
view_histogram)
cv.imwrite(str(current_image_path), filtered_image)
filtered_image = prepare_image_for_metric(filtered_image)
psnr_val, ssim_val = calculate_metrics(original_image,
filtered_image,
data_range=1.0)
# blurred_ref = img_obj.get_blurred()
img_obj.add_PSNR(psnr_val, blurred_path, alg_name)
img_obj.add_SSIM(ssim_val, blurred_path, alg_name)
img_obj.add_algorithm(alg_name)
img_obj.add_restored(str(current_image_path), str(blurred_path), alg_name)
def _inverse_histogram_equalization_one(self,
current_image: np.ndarray,
original_blurred_image: np.ndarray,
view_histogram: bool = False) -> np.ndarray:
"""Выполняет обращение выравнивания для одного изображения."""
filtered_image = match_histograms(image=current_image,
reference=original_blurred_image)
if (view_histogram):
hist1 = histogram(current_image)
hist2 = histogram(filtered_image)
plt.figure(figsize=(12, 6))
plt.bar(hist1[1], hist1[0], alpha=0.5, color='blue')
plt.bar(hist2[1], hist2[0], alpha=0.5, color='red')
plt.grid(alpha=0.3)
plt.show()
cdf1 = cumulative_distribution(current_image)
cdf2 = cumulative_distribution(filtered_image)
plt.figure(figsize=(12, 6))
plt.plot(cdf1[0], cdf1[1], color='blue')
plt.plot(cdf2[0], cdf2[1], color='red')
plt.show()
return filtered_image