
6
.pdf
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
Кафедра 41
ПРЕПОДАВАТЕЛЬ |
|
|
|
|
|
|
доц., к.т.н., доц. |
|
|
|
О. О. Жаринов |
|
|
|
|
|
|
|
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
Лабораторная работа №6 ОСНОВЫ ЦИФРОВОЙ ФИЛЬТРАЦИИ ИЗОБРАЖЕНИЙ. МЕТОД
ФИЛЬТРАЦИИ ВСПЕКТРАЛЬНОМ ПРОСТРАНСТВЕ
по курсу: Мультимедиа технологии
СТУДЕНТКА ГР. № Z0411 |
11.04.25 |
|
М. В. Карелина |
||
|
|
|
|
|
|
|
номер группы |
|
подпись, дата |
|
инициалы, фамилия |
Номер студенческого билета: 2020/3477
Санкт-Петербург
2025
1
Цель работы: изучить основы обработки изображений на примере методов фильтрации, реализуемых в спектральном пространстве. Краткие теоретические сведения: фильтрация представляет собой один из наиболее широко используемых методов обработки изображений. Основные концепции, лежащие в основе методов фильтрации, заимствованы из методологии обработки одномерных сигналов, таких как аудио. Однако в отличие от фильтрации одномерных цифровых сигналов, которые представляют собой последовательность чисел, упорядоченных по времени,
последовательность значений пикселей в изображении организована в соответствии с индексами строк и столбцов матрицы. Таким образом, если для временных сигналов период измеряется в секундах, а частота — в Герцах ([Гц] = [1/с]), то для изображений период повторения группы пикселей и соответствующая пространственная частота выражаются в условных безразмерных единицах. Тем не менее, для обработки изображений также эффективно применяются методы, направленные на целенаправленное воздействие на определенные частотные компоненты для изменения свойств изображения.
Фильтрационные методы обычно используются для улучшения качества изображений, например, для увеличения резкости нечетких или смазанных изображений. Кроме того, фильтрация часто является одним из этапов более сложных многоступенчатых процессов обработки, таких как методы выделения границ объектов на изображениях. В данной работе для решения поставленных задач будет применяться библиотека Python CV2.
Теперь мы перейдем к обработке изображений с использованием метода Фурье. Метод Фурье является мощным инструментом, позволяющим анализировать и обрабатывать сигналы в частотной области. Он особенно полезен для задач, связанных с выделением границ объектов, поскольку позволяет отделить высокочастотные компоненты (соответствующие резким перепадам яркости) от низкочастотных (которые представляют собой более гладкие участки изображения).
2

В листинге 1 представлена простейшая программа, реализующая алгоритм Фурье-фильтрации изображения с целью выделения границ объектов. Для повышения контрастности выходного изображения выполняется нормировка, в результате которой максимальное значение массива яркостей становится равно 255. На рисунке 1 исходное изображение,
на 2 рисунке обработанное изображение с параметром частоты среза фильтра
0.20, также на 3 рисунке представлен амплитудный спектр обработанного изображения. Далее на рисунках 4 и 5 представлены изменения параметра на
0.05, а на рисунках 6 и 7 – 0.40.
Листинг 1. Программа, реализующая простейший способ реализации метода
Фурье-фильтрации изображения с целью выделения краев объектов
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Чтение изображения из файла input_image = cv2.imread('LR6.jpg')
#Преобразование цветного изображения в черно-белое
#Это необходимо, так как мы будем работать только с границами (краями) изображения
L = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
#Визуализация исходного изображения
plt.figure()
plt.imshow(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB)) plt.title('Исходное изображение') # Заголовок для визуализации plt.axis('off') # Отключаем оси для более чистого вида plt.tight_layout() # Убираем лишние пробелы
plt.show() # Показываем изображение
#Выполнение двумерного центрального быстрого преобразования Фурье (БПФ)
#для получения спектра частот изображения
Spectr = np.fft.fftshift(np.fft.fft2(L))
# Компоненты нормировки для дальнейших расчетов
Min_S = np.min(np.abs(Spectr)) # Находим минимальное значение спектра eps = Min_S if Min_S != 0 else np.max(np.abs(Spectr)) * 1e-9 # Защита от деления на ноль
# Определяем размеры изображения
M, N = L.shape[0], L.shape[1] # Высота (M) и ширина (N)
# Устанавливаем размер области низких частот в спектре
d_high = round(0.20 * np.minimum(M, N)) # 20% от меньшего значения между высотой и шириной
# Определяем индексы границ области низких частот, принимая во внимание симметрию
3

if M % 2 == 0: # Если высота четная
(m_dn, m_up) = (M // 2 - d_high, M // 2 + d_high) if N % 2 == 0: # Если ширина четная
(n_dn, n_up) = (N // 2 - d_high, N // 2 + d_high) if M % 2 != 0: # Если высота нечетная
(m_dn, m_up) = (M // 2 - d_high, M // 2 + d_high + 1) if N % 2 != 0: # Если ширина нечетная
(n_dn, n_up) = (N // 2 - d_high, N // 2 + d_high + 1)
# Создаем частотную маску для высоких частот
mask_high = np.ones_like(L) # Инициализируем маску единицами mask_high[m_dn:m_up, n_dn:n_up] = 0 # Зануляем область низких частот в центре маски
# Применяем высокочастотный фильтр к спектру
Spectr_high_pass_filtered = Spectr * mask_high # Умножаем спектр на маску
#Выполняем обратное преобразование Фурье, чтобы получить отфильтрованное изображение
high_pass_filtered = np.fft.ifft2(np.fft.ifftshift(Spectr_high_pass_filtered))
#Проверяем, что нет значительной доли мнимых значений в отфильтрованном изображении
print(np.max(np.abs(np.imag(high_pass_filtered))) / np.max(np.abs(np.real(high_pass_filtered))))
#Берем модуль отфильтрованного изображения, так как яркость не может быть отрицательной
high_pass_filtered = np.abs(high_pass_filtered.real)
#Нормируем результат отфильтрованного изображения на максимальный размах edges_high_pass = cv2.normalize(high_pass_filtered, None, 0.0, 1.0, cv2.NORM_MINMAX)
edges_high_pass = 1 - edges_high_pass # Инвертируем цвет для выделения краев
#Визуализируем результат после высокочастотной фильтрации
plt.figure()
plt.imshow(edges_high_pass, cmap='gray') # Показываем в градациях серого plt.title('Фильтр высоких частот') # Заголовок для визуализации plt.axis('off') # Отключаем оси
plt.tight_layout() # Убираем лишние пробелы plt.show() # Показываем изображение
#Вычисляем амплитудный спектр после применения маски в децибелах (дБ) Spectr_dB = 20 * np.log10(np.abs(Spectr_high_pass_filtered) + eps)
#Исправляем значение для центральной точки, чтобы избежать проблем с отображением
Spectr_dB[0, 0] = 20 * np.log10(np.max(np.abs(Spectr)))
#Визуализируем амплитудный спектр в дБ
plt.figure()
plt.imshow(Spectr_dB, cmap='jet') # Используем цветовую карту 'jet' для визуализации
plt.title('Амплитудный спектр после ФВЧ (дБ)') # Заголовок для визуализации plt.axis('off') # Отключаем оси
plt.tight_layout() # Убираем лишние пробелы plt.show() # Показываем изображение
# Сохраняем итоговое отфильтрованное изображение с нормировкой яркости от 0
до 255
4

cv2.imwrite('LR6.3.jpg',
cv2.normalize((edges_high_pass * 255).astype('uint8'), None, 0, 255, cv2.NORM_MINMAX))
Рисунок 1 – Исходное изображение
5

Рисунок 2 – Обработанное изображение с |
Рисунок 3 – Амплитудный спектр |
параметром среза частоты фильтра 0.20 |
обработанного изображения |
Рисунок 4 – Обработанное изображение с |
Рисунок 5 – Амплитудный спектр |
параметром среза частоты фильтра 0.05 |
обработанного изображения |
6

Рисунок 6 – Обработанное изображение с |
Рисунок 7 – Амплитудный спектр |
параметром среза частоты фильтра 0.40 |
обработанного изображения |
Далее будет рассмотрена фильтрация изображения с использованием Фурье-фильтра Баттерворта. Мы применим три различных значения параметра частоты среза, чтобы проанализировать их влияние на обработку изображения:
1.\(d_{\text{high}} = 0.20 \cdot \text{min}(M, N)\) (20%): Подавление низкочастотных компонент с сохранением более высоких частот, что выделяет края и детали. Результат представлен на рисунках 8 и 9.
2.\(d_{\text{high}} = 0.05 \cdot \text{min}(M, N)\) (5%): Умеренное подавление низких частот, позволяющее сохранить средние частоты для достижения сбалансированного результата. Результат можно увидеть на рисунках 10 и 11.
3.\(d_{\text{high}} = 0.40 \cdot \text{min}(M, N)\) (40%): Более резкое подавление низкочастотных компонент, акцентируя внимание на текстурах и детализации. Результаты представлены на рисунках 12 и 13.
Фильтрация Баттерворта предпочтительна, поскольку она обеспечивает плавные переходы и минимизирует артефакты, сохраняя естественность текстуры изображения. Результаты обработки позволят оценить, как
7

изменения в параметрах фильтрации влияют на четкость и контраст
изображения. Программный код представлен в листинге 2.
Листинг 2. Программный код, в которой реализован метод Фурье-фильтрации изображения с целью выделения краев объектов посредством формирования маски фильтра на основе пространственного ФВЧ Баттерворта
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Чтение изображения
input_image = cv2.imread('LR6.jpg')
#Преобразование изображения в черно-белое, чтобы работать только с гранями
L = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)
#Визуализация исходного изображения
plt.figure()
plt.imshow(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB)) plt.title('Исходное изображение')
plt.axis('off') # Убираем оси plt.tight_layout()
plt.show()
#Выполнение двумерного центрированного БПФ для получения спектра
Spectr = np.fft.fftshift(np.fft.fft2(L))
#Вычисление компоненты нормировки
Min_S = np.min(np.abs(Spectr))
eps = Min_S if Min_S != 0 else np.max(np.abs(Spectr)) * 1e-9 # Защита от деления на ноль
# Фильтр высоких частот (ФВЧ) с маской Баттерворта M, N = L.shape # Получаем размеры изображения
d_high = round(0.20 * np.minimum(M, N)) # Оптимальный размер области НЧ в спектре
K = 4 # Порядок фильтра Баттерворта deg = 2 * K # Степень фильтра
mask_high = np.zeros((M, N)) # Инициализация маски высокого пропускания Cm, Cn = M / 2, N / 2 # Координаты центра маски
#Формирование маски Баттерворта for m in range(M):
for n in range(N):
d = np.sqrt((m - Cm) ** 2 + (n - Cn) ** 2) # Расчет расстояния до
центра
mask_high[m, n] = (d / d_high) ** K / np.sqrt(1 + (d / d_high) ** deg) # Формула Баттерворта
#Применяем маску Баттерворта к спектру
Spectr_high_pass_filtered = Spectr * mask_high # Умножаем спектр на маску
#Вычисляем обратное двумерное БПФ для получения отфильтрованного изображения
high_pass_filtered = np.fft.ifft2(np.fft.ifftshift(Spectr_high_pass_filtered))
#Проверка корректности работы фильтра
print(np.max(np.abs(np.imag(high_pass_filtered))) /
8

np.max(np.abs(np.real(high_pass_filtered))))
#Берем модуль, так как яркость не может быть отрицательной high_pass_filtered = np.abs(high_pass_filtered.real)
#Нормировка изображения на максимальный размах
edges_high_pass = cv2.normalize(high_pass_filtered, None, 0.0, 1.0, cv2.NORM_MINMAX)
edges_high_pass = 1 - edges_high_pass # Инвертирование изображения для акцента на краях
#Бинаризация результата
#Используем порог 0.5 для бинаризации
_, binary_image = cv2.threshold(edges_high_pass, 0.5, 1, cv2.THRESH_BINARY)
#Визуализация результата бинаризации plt.figure()
plt.imshow(binary_image, cmap='gray') plt.title('Бинаризованное изображение после ФВЧ') plt.axis('off') # Убираем оси
plt.tight_layout() plt.show()
#Вычисление амплитудного спектра после применения маски
Spectr_dB = 20 * np.log10(np.abs(Spectr_high_pass_filtered) + eps)
#Исправляем цвет для отображения, чтобы избежать проблем с битой точкой
Spectr_dB[0, 0] = 20 * np.log10(np.max(np.abs(Spectr)))
#Визуализация амплитудного спектра в дБ
plt.figure() plt.imshow(Spectr_dB, cmap='jet')
plt.title('Амплитудный спектр после ФВЧ (дБ)') plt.axis('off') # Убираем оси plt.tight_layout()
plt.show()
# Сохранение итогового бинаризованного изображения с нормировкой (яркость от
0 до 255) cv2.imwrite('LR6.6.jpg',
cv2.normalize((binary_image * 255).astype('uint8'), None, 0, 255, cv2.NORM_MINMAX))
9

Рисунок 8 – Обработанное изображение с |
Рисунок 9 – Амплитудный спектр |
параметром среза частоты фильтра 0.20 |
обработанного изображения |
Рисунок 10 – Обработанное изображение |
Рисунок 11 – Амплитудный спектр |
с параметром среза частоты фильтра 0.05 |
обработанного изображения |
|
10 |