Список использованных источников
Обработка изображений с помощью библиотеки Python Pillow // URL: https://habr.com/ru/articles/681248/
Документация skimage.filters (на англ. яз.) // URL: https://scikitimage.org/docs/stable/api/skimage.filters.html
Intro to OpenCV for Image Processing with Python // URL: https://qviper.github.io/2022/09/24/intro-to-opencv-for-image-processing-python/
Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №7 по дисциплине “Мультимедиа-технологии “, гр.4116, 4117, 4018. ГУАП, 2025. – 21 с. (Интернет-ресурс) // URL: https://pro.guap.ru/inside/student/tasks/e4715578ed7486d8d1746488fafcaeed/download
Приложение а
import cv2
from skimage import restoration
import numpy as np
import matplotlib.pyplot as plt
# функция, создающая маску двоения
# size - размер размаза в пикселях
def double_mask(size):
k = np.zeros((size, size), dtype=np.float32)
# Находим центральную строку
center = (size-1) // 2
k[center, 0] = 1.0
k[center, -1] = 1.0
k = k/np.sum(k) # нормировка
return k
# Создаем три разные маски
size_original = 15
PSF_original = double_mask(size_original) # оригинальная маска
size_small_diff = 17
PSF_small_diff = double_mask(size_small_diff) # маска с небольшим отклонением
size_large_diff = 25
PSF_large_diff = double_mask(size_large_diff)
input_image = cv2.imread('C:/jjjj.jpg')
# нормировка данных изображения и перевод во float:
input_image = input_image.astype(np.float32)/255.
# Визуализация исходного размытого изображения
plt.figure(figsize=(10, 8))
plt.imshow(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB))
plt.title('Исходное размытое изображение')
plt.axis('off')
plt.tight_layout()
plt.show()
# Восстановление с правильной маской
print("\nВосстановление с правильной маской:")
noise_var = 0.01
image_deblur = input_image.copy()
for i in range(3):
image_deblur[:, :, i] = restoration.wiener(input_image[:, :, i], PSF_original, noise_var)
plt.figure()
plt.imshow(cv2.cvtColor(np.clip(image_deblur, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Восстановление с правильной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
# Восстановление с маской с небольшим отклонением
print("\nВосстановление с маской с небольшим отклонением (~13%):")
image_deblur_small_diff = input_image.copy()
for i in range(3):
image_deblur_small_diff[:, :, i] = restoration.wiener(input_image[:, :, i], PSF_small_diff, noise_var)
plt.figure()
plt.imshow(cv2.cvtColor(np.clip(image_deblur_small_diff, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Восстановление с немного измененной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
# Восстановление с маской с существенным отклонением
print("\nВосстановление с маской с существенным отклонением (~53%):")
image_deblur_large_diff = input_image.copy()
for i in range(3):
image_deblur_large_diff[:, :, i] = restoration.wiener(input_image[:, :, i], PSF_large_diff, noise_var)
plt.figure()
plt.imshow(cv2.cvtColor(np.clip(image_deblur_large_diff, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Восстановление с существенно измененной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
# Теперь то же самое для метода Ричардсона-Люси
print("\nВосстановление методом Ричардсона-Люси:")
its = 25
image_deblur_rl = input_image.copy()
for i in range(3):
try:
image_deblur_rl[:, :, i] = restoration.richardson_lucy(
input_image[:, :, i], PSF_original, num_iter=its)
except:
print(f"Ошибка при восстановлении канала {i} с правильной маской")
plt.figure(figsize=(10, 8))
plt.imshow(cv2.cvtColor(np.clip(image_deblur_rl, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Ричардсон-Люси с правильной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
image_deblur_rl_small = input_image.copy()
for i in range(3):
try:
image_deblur_rl_small[:, :, i] = restoration.richardson_lucy(
input_image[:, :, i], PSF_small_diff, num_iter=its)
except:
print(f"Ошибка при восстановлении канала {i} с немного измененной маской")
plt.figure(figsize=(10, 8))
plt.imshow(cv2.cvtColor(np.clip(image_deblur_rl_small, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Ричардсон-Люси с немного измененной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
# С маской с существенным отклонением
image_deblur_rl_large = input_image.copy()
for i in range(3):
try:
image_deblur_rl_large[:, :, i] = restoration.richardson_lucy(
input_image[:, :, i], PSF_large_diff, num_iter=its)
except:
print(f"Ошибка при восстановлении канала {i} с существенно измененной маской")
plt.figure(figsize=(10, 8))
plt.imshow(cv2.cvtColor(np.clip(image_deblur_rl_large, 0, 1), cv2.COLOR_BGR2RGB))
plt.title('Ричардсон-Люси с существенно измененной маской')
plt.axis('off')
plt.tight_layout()
plt.show()
cv2.imwrite('C:/Users/Пользователь/Downloads/wiener_restored.jpg',
cv2.cvtColor((image_deblur * 255).astype(np.uint8), cv2.COLOR_RGB2BGR))
cv2.imwrite('C:/Users/Пользователь/Downloads/lucy_restored.jpg',
cv2.cvtColor((image_deblur_rl * 255).astype(np.uint8), cv2.COLOR_RGB2BG
