Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МТ_ЛР6_Иванова_4117.docx
Скачиваний:
1
Добавлен:
29.04.2025
Размер:
21.42 Mб
Скачать

ГУАП

КАФЕДРА № 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.