Лабораторная 6. Частотная фильтрация
Частотная фильтрация.
Для частотной фильтрации использовать БПФ (средствами OpenCV)
Показать пошаговое применение частотных сглаживающих и повышающих резкость фильтров:
Показать в сравнении идеальный фильтр, Батерворта и гауссиан
Что нужно показывать!!!
- Исходное изображение.
- Спектр изображения
- Частотный фильтр для сглаживания
- Результат наложения в виде спектра и в виде изображения
- Частотный фильтр для повышения резкости
- Результат наложения в виде спектра и в виде изображения
Дополнительное задание
Дополнитнительное задание необходимо выполнить для получения полного балла за лабораторную работу.
Цель работы — изучить методы подавления шума на изображении с помощью локального (оконного) анализа частот и пороговой фильтрации спектра.
1. Подготовка данных
-
Выберите любое градационное изображение (предпочтительно размером не менее 256×256).
-
Добавьте к нему гауссов шум со стандартным отклонением σ ≥ 25.
Пример:
import numpy as np
from skimage import io, img_as_float
from skimage.util import random_noise
img = img_as_float(io.imread('image.png', as_gray=True))
noisy = random_noise(img, mode='gaussian', var=(25/255)**2)
2. Оконное преобразование Фурье и вычисление порога
Для каждого окна изображения необходимо:
-
Разбить изображение на перекрывающиеся или неперекрывающиеся окна фиксированного размера
(например, 32×32 или 64×64). -
Для каждого окна применить преобразование Фурье с прямой нормализацией:
F = np.fft.fft2(window, norm='forward') magnitude = np.abs(F) -
Сохранить модули спектра всех окон в общий массив.
-
Линеаризовать массив (flatten) и вычислить 98-й процентиль.
Это значение используется как порог R:R = np.percentile(all_magnitudes, 98)Опционально: можно применить идеальный ФНЧ внутри каждого окна перед сбором статистики, чтобы исключить слишком высокочастотные выбросы.
3. Глобальное преобразование Фурье и пороговая фильтрация
-
Вычислить глобальное преобразование Фурье всего зашумлённого изображения с параметром
norm='forward':F_full = np.fft.fft2(noisy, norm='forward') -
Обнулить все частоты, чей модуль не превышает найденный порог R (лучше ослабить порог, умножив на 0.1):
F_filtered = F_full.copy() F_filtered[np.abs(F_filtered) < R * 0.1] = 0
4. Обратное преобразование и визуализация результата
Выполнить обратное ПФ с тем же параметром нормализации:
denoised = np.fft.ifft2(F_filtered, norm='forward').real
Отобразить итоговое изображение.
5. Оценка качества восстановления
Рассчитать значения метрики PSNR:
-
между оригинальным изображением и изображением с шумом;
-
между оригинальным изображением и изображением после фильтрации.
Пример:
from skimage.metrics import peak_signal_noise_ratio as psnr
psnr_noisy = psnr(img, noisy)
psnr_denoised = psnr(img, denoised)
Отчёт по дополнительному заданию должен содержать
-
исходное изображение и вариант с шумом;
-
иллюстрацию спектра исходного и отфильтрованного изображений;
-
используемые параметры (размер окна, σ шума, процентиль);
-
итоговые значения PSNR.