
ГУАП
КАФЕДРА № 41
ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ
ПРЕПОДАВАТЕЛЬ
доц., к.т.н., доц. |
|
|
|
О.О. Жаринов |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ №6 |
ОСНОВЫ ЦИФРОВОЙ ФИЛЬТРАЦИИ ИЗОБРАЖЕНИЙ. МЕТОД ФИЛЬТРАЦИИ В СПЕКТРАЛЬНОМ ПРОСТРАНСТВЕ. |
по курсу: МУЛЬТИМЕДИА-ТЕХНОЛОГИИ |
|
|
РАБОТУ ВЫПОЛНИЛ
СТУДЕНТ ГР. № |
4117 |
|
|
|
А.В. Иванова |
|
|
|
подпись, дата |
|
инициалы, фамилия |
Санкт-Петербург 2025
Цель работы:
Изучить основы обработки изображений на примере методов фильтрации, реализуемых в спектральном пространстве.
Краткие теоретические сведения:
Фильтрация является одним из широко применяемых методов обработки изображений.
При реализации фильтрации изображений часто применяют метод фильтрации в спектральном пространстве (метод Фурье-фильтрации). Идея метода заключается в вычислении двумерного спектра {Xn,m} исходного изображения {xn,m}, последующей модификации спектра в соответствии заданными частотными характеристиками пространственного фильтра и формировании выходного изображения посредством вычисления обратного двумерного преобразования Фурье модифицированного спектра {Yn,m}.
Для модификации спектра исходного изображения {Xn,m} необходимо задать массив отсчётов двумерной дискретной передаточной функции фильтра {Wn,m} и умножить значения исходного спектра {Xn,m} на функцию {Wn,m}.
Важно помнить, что свойство комплексно-сопряжённой симметрии двумерного БПФ требует обязательного выполнения такого же условия симметрии для массива {Wn,m}. В двумерном случае симметрия должна быть относительно точки, расположенной в центре. Для реализации
принципа симметрии в библиотечном модуле numpy имеется метод центрирования спектра fftshift(). Метод осуществляет двумерный циклический сдвиг спектра, таким образом, что компоненты спектра с нулевыми и/или максимальными индексами сдвигаются в центр матрицы спектра.
Тогда при необходимости оставить в изображении только низкие частоты, необходимо оставить в спектре только двумерную область, близкую к центру спектра, симметричную относительно центра.
Если требуется выделить края объектов, а сами объекты сделать незаметными, то нужно оставить только высокие частоты, для чего следует уменьшить значения спектра, находящиеся близко к центру матрицы.
По окончании модификаций центрированного спектра обязательно осуществляется его обратный сдвиг (методом ifftshift()) и вычисляется двумерного обратное БПФ, в результате чего формируется отфильтрованное изображение, свойства которого нужным образом отличаются от исходного.
Выполнение работы:
В качестве исходного изображения выбран рисунок шахматных фигур (Рисунок 1). Посредством Фурье преобразования получен спектр исходного изображения, представленный на Рисунке 2. В Листинге 1 представлена реализация методов отображения изображений, получения спектра изображения и построение отображения спектра.
Листинг 1 — Построение изображения, получение спектра
import cv2
import numpy as np
import matplotlib.pyplot as plt
input_image = cv2.imread('img/chess_pieces.jpg') # Чтение изображения
L = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY) # перевод в черно-белое
# Визуализация заданного изображения
def plot_img(img,title):
plt.figure()
plt.imshow(img ,cmap='gray')
plt.title(title)
plt.axis('off')
plt.tight_layout()
plt.show()
def plot_spectr(Spectr_dB, title):
plt.figure()
plt.imshow(Spectr_dB, cmap='jet')
plt.title(title)
plt.axis('off')
plt.tight_layout()
plt.show()
plot_img(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB),'Исходное изображение')
def get_spectr(L):
Spectr = np.fft.fftshift(np.fft.fft2(L))
eps = np.max(np.abs(Spectr)) * 1e-9
Spectr_dB = 20 * np.log10(np.abs(Spectr) + eps)
return Spectr, Spectr_dB
Рисунок 1 — Исходное изображение
Рисунок 2 — Исходный спектр изображения
На основе методических указаний реализовано несколько методов выделения контуров изображения: простейшая Фурье фильтрация (simple_fft), фильтр Баттерворта (butter_fft), оператор Кэнни (canny), метод применения бинаризации (binarization). Код функций приведён в Листинге 2.
Листинг 2 — Реализация методов обработки изображения
def simple_fft(M, N, d_high):
# Фильтр высоких частот (ФВЧ) с прямоугольной маской:
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 # занулили обл. у центра
return mask_high
def butter_fft(M,N,d_high):
# Фильтр высоких частот (ФВЧ) с прямоугольной маской:
K = 2 # порядок фильтра
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)
return mask_high
def binarization(edges_high_pass, threshold_value):
# бинаризация
thr, edges_high_pass = cv2.threshold(edges_high_pass, threshold_value, 1.0, cv2.THRESH_BINARY)
return edges_high_pass
# Оператор кэнни
def canny(input_image):
edges_canny = cv2.Canny(input_image,
threshold1=50, threshold2=150)
plt.figure()
edges_canny = 255 - edges_canny
plt.imshow(edges_canny, cmap='gray')
plt.title('Оператор Кэнни')
plt.axis('off')
plt.tight_layout()
plt.show()
Далее реализован метод img_filter, позволяющий выполнить настраиваемую обработку изображения, параметрами которого является черно-белое изображение, применяемый метод фильтрации, значение частоты среза, необходимость в бинаризации результата. Также приведены примеры задания разных параметров обработки изображения — разные размеры области обнуления. Код метода представлен в Листинге 3.