Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет_лаба6.docx
Скачиваний:
0
Добавлен:
25.04.2024
Размер:
4.23 Mб
Скачать

ГУАП

КАФЕДРА 41

ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ

ПРЕПОДАВАТЕЛЬ

доцент, канд. тех. наук, доцент

О. О. Жаринов

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ № 6

ОСНОВЫ ЦИФРОВОЙ ФИЛЬТРАЦИИ ИЗОБРАЖЕНИЙ СРЕДСТВАМИ PYTHON. МЕТОД ФИЛЬТРАЦИИ В СПЕКТРАЛЬНОМ ПРОСТРАНСТВЕ

по курсу: Мультимедиа технологии

РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР. №

подпись, дата

инициалы, фамилия

Санкт-Петербург 2024

Цель работы

Изучить основы обработки изображений на примере методов фильтрации, реализуемых в спектральном пространстве.

Теоретические сведения

Цифровые изображения – графические изображения, состоящие из конечного набора пикселей, каждый из которых имеет свои числовые значения, определяющие цвет и яркость пикселя. Основные методы улучшения визуальных характеристик цифровых изображений можно разделить на следующие категории:

  • Фильтры и коррекция изображений: Включают в себя применение различных фильтров и коррекций для изменения цвета, контраста, яркости и других параметров изображения;

  • Увеличение резкости: Применение алгоритмов, которые увеличивают четкость и детализацию изображения путем подчеркивания границ и текстур.

  • Устранение шума: Цифровые изображения могут содержать различные виды шума, такие как аппаратный шум (например, сигналы от датчиков в камере) или артефакты сжатия изображения. Методы улучшения включают в себя фильтры для уменьшения или удаления такого шума без существенного воздействия на основные детали изображения.

  • Сегментация и улучшение детализации: Процессы разделения изображения на различные сегменты или объекты и применения специальных методов улучшения детализации для каждого сегмента.

  • Цветовая коррекция и баланс белого: Методы, позволяющие изменять цветовую гамму изображения, корректировать баланс белого и другие параметры цвета для достижения желаемого визуального эффекта.

Обзор имеющихся функций

В первой части лабораторной работы необходимо переписать программы, представленные в методическом пособии [2]. Первым делом была переписана функция вычисления двумерного центрированного спектра изображения, а также его визуализация. Таким образом, в таблице 1 показан список используемых переменных, а в листинге 1 – программный код функции.

Таблица 1. Список используемых переменных

Название

Тип

Описание

img

Двумерный массив

Считанное изображение

S

Двумерный массив

Центрированный спектр изображения

A_max

Дробное число

Максимальное значение из амплитуд

eps

Дробное число

Добавка, чтобы избавиться от lg(0)

A_dB

Двумерный массив

Амплитудный спектр изображения

Листинг 1. Функция расчета спектра изображения

def calcspec(img, for_graph: bool = False):

if len(img.shape) == 3:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img = img.astype(float)

S = np.fft.fftshift(np.fft.fft2(img))

A = np.abs(S)

A_max = np.max(A)

eps = A_max * 10**(-6)

A_dB = 20 * np.log10(A + eps)

if for_graph:

return A_dB

return S, eps

Для демонстрации работы данной функции (и последующих в том числе), были выбраны изображения, представленные на рисунках 1 и 2 Первая картинка была взята из портфолио одного Австралийского фотографа [4], а вторая была сгенерированная нейросетью Шедеврум [3].

Рисунок 1 – Контрастная машина

Рисунок 2 – Городской пейзаж

Первым созданным спектральным фильтром стал фильтр, вырезающий квадратную область в спектральном пространстве. В таблице 2 приведен список используемых переменных, а в листинге 2 – исходный программный код фильтра.

Таблица 2. Список используемых переменных.

Название

Тип

Описание

img

Двумерный массив

Считанное изображение

Param

Целое число

Границы пространственного фильтра

Spectre_input

Двумерный массив

Спектр исходного изображения

mask

Двумерный массив

Маска для создания фильтра

Spectre_output

Двумерный массив

Спектр после применения фильтра

output

Двумерный массив

Восстановленное изображение

Листинг 2. Функция «квадратного» фильтра

def squarefilter(img, param, plot: bool = False):

# Вычисление спектра изображения + размеры

spectre_input, _ = calcspec(img)

M, N = spectre_input.shape

# Пространственная частота + маска фильтрации

space_freq = param

mask = np.ones_like(spectre_input)

# Создание прямоугольной области

mask[round(M/2) - space_freq: round(M/2) + space_freq,

round(N/2) - space_freq: round(N/2) + space_freq] = 0

# Применение маски

spectre_output = spectre_input * mask

# Обратное преобразование

J = np.abs(np.fft.ifft2(np.fft.ifftshift(spectre_output)))

# Нормировка значений пикселей

max_J = np.max(J)

output = np.uint8((J / max_J) * 255)

output = 255 - output

if plot:

image_spectre(output, spectre_output)

return output

Далее, на рисунке 3 показан результат запуска данного фильтра для картинки с машиной. Поскольку границы пространственного фильтра – величина изменчивая, опытным путем было получено, что наилучший результат достигается при значении 30. На рисунке 3 как раз и показан результат при данном значении.

Рисунок 3 – Применение «квадратного фильтра»

Из данного рисунка видно, что на картинке присутствуют артефакты, называемые «звоном». Для того, чтобы уменьшить их переход от полосы пропускания необходимо сгладить. Для этого, был реализован фильтр с областью подавления в форме обратного колокола. В листинге 3 представлен код созданного фильтра.

Листинг 3. Функция «колоколообразного» фильтра

def bellfilter(img, param, plot: bool = False):

# Вычисление спектра изображения + размеры

spectre_input, _ = calcspec(img)

x, y = spectre_input.shape

# Пространственная частота + маска фильтрации

space_freq = param

mask = np.ones_like(spectre_input)

# Создание маски

cx, cy = round(x/2), round(y/2)

nx, ny = np.meshgrid(np.arange(x), np.arange(y))

mask = 1 - (np.exp(-((cx - nx) / space_freq) ** 2) * np.exp(-((cy - ny) / space_freq) ** 2))

# Применение маски

spectre_output = spectre_input * mask

# Обратное преобразование

J = np.abs(np.fft.ifft2(np.fft.ifftshift(spectre_output)))

# Нормировка значений пикселей

max_J = np.max(J)

output = np.uint8((J / max_J) * 255)

output = 255 - output

if plot:

image_spectre(output, spectre_output)

return output

Для того, чтобы оценить, насколько уменьшились артефакты, необходимо запустить данный фильтр с теми же параметрами, какие были и в предыдущем случае. Таким образом, на рисунке 4 показано сравнение двух картинок, восстановленных после данных фильтров.

Рисунок 4 – Сравнение «квадратного» и «колоколообразного» фильтров

Из данного рисунка видно, что количество «звона» уменьшилось, но тем не менее артефакты остались.

Вторым способом уменьшения влияния «звона» на итоговое изображение путем сглаживания является использование гладких функций двух переменных. Таким образом, была применена формула (2) из методического пособия. Также, как и в предыдущих случаях была разработана функция данного фильтра, она представлена в листинге 4.

Листинг 4. Функция «формульного» фильтра

def newfilter(img, D_up, K, plot: bool = False):

# Вычисление спектра изображения и начальных параметров

S_I, _ = calcspec(img)

M, N = S_I.shape

Cn = round(N / 2)

Cm = round(M / 2)

# Формирование массива d и W

nx, ny = np.meshgrid(np.arange(N), np.arange(M))

d = np.sqrt((nx - Cn) ** 2 + (ny - Cm) ** 2)

deg = 2 * K

W = (d/ D_up) ** K / np.sqrt(1 + (d/ D_up) ** deg)

# Применение фильтра к спектру

S_J = S_I * W

# Обратное преобразование Фурье

J = np.abs(np.fft.ifft2(np.fft.ifftshift(S_J)))

# Нормализация и инверсия изображения

max_J = np.max(J)

output_image = (255 * (J / max_J)).astype(np.uint8)

output_image = 255 - output_image

if plot:

image_spectre(output_image, S_J)

return output_image

Также, как и в предыдущем случае сравним результаты обработки изображения данным фильтром и фильтром с квадратной областью фильтрации. Полученные результаты показаны на рисунке 5.

Рисунок 5 – Сравнение «квадратного» фильтра и пространственного ФВЧ

Из данного рисунка видно, что фильтрация вторым способом значительно лучше того, что получается первым фильтром. Также, стоит сравнить данный фильтр с «колоколообразным», что и представлено на рисунке 6.

Рисунок 6 – Сравнение «колоколообразного» фильтра и пространственного ФВЧ

Из данного сравнения видно, что второй фильтр снова оказывается лучше, поскольку границы у объектов становятся более четкими.

Также, существует также множество других алгоритмов, предназначенных для выделения границ объектов. В MATLAB их присутствует более 7, однако в Python полноценно реализованных всего лишь 2: метод Собеля и метод Кенни. Для применения данных методов была разработана функция, программный код которой представлен в листинге 5.

Листинг 5. Функция встроенных фильтров

def presetfilters(img, ftype: str, ddepth = cv2.CV_16S, ksize=3, threshold1=100, threshold2 = 200):

if len(img.shape) == 3:

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

match ftype:

case "Sobel":

grad_x = cv2.Sobel(img, ddepth, 1, 0, ksize=ksize)

grad_y = cv2.Sobel(img, ddepth, 0, 1, ksize=ksize)

abs_grad_x = cv2.convertScaleAbs(grad_x)

abs_grad_y = cv2.convertScaleAbs(grad_y)

edges = cv2.addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0)

case "Canny":

edges = cv2.Canny(img, threshold1=threshold1, threshold2=threshold2).astype(np.uint8)

edges = 255 - edges

return edges

Далее, необходимо сравнить результаты работы данных фильтров с другими, реализованными ранее фильтрами. Поскольку было получено, что из предыдущих трёх фильтров наилучшей точностью обладает пространственный ФВЧ, было принято решение сравнивать с ним. Таким образом на рисунке 7 показано сравнение ФВЧ и Собеля, а на рисунке 8 ФВЧ и Кенни.

Рисунок 7 – Сравнение ФВЧ и Собеля

Рисунок 8 – Сравнение ФВЧ и Кенни

Из данных рисунков видно, что фильтрация методом Собеля является наиболее четкой из всех ранее рассмотренных фильтров. Однако, это является и недостатком, поскольку он выделяет даже те границы, которые не нужно выделять, например рельеф асфальта или облака в небе. Фильтр Кенни в свою очередь не настолько сильно выделяет границы объектов, однако также обладает достаточно высокой степенью детализации. Для наглядного сравнения данных двух фильтров между собой, на рисунке 9 показана разница в степени детализации машины у данных фильтров.

Рисунок 9 – Сравнение степени детализации

Из данного сравнения видно, что разница настолько незначительна, что ее очень трудно увидеть. Однако, если приглядеться, то можно заметить, что очертания двери машины лучше все-таки получились с применением фильтра Собеля, нежели Кенни.

Также, в качестве дополнительного испытания, попробуем выделить границы объектов на второй картинке. Данная картинка примечательна тем, что, во-первых, на ней много различных объектов, а во-вторых, картинка сама по себе немного размытая. Результат применения фильтра Собеля на данную картинку показан на рисунке 10.

Рисунок 10 – Выделение объектов второй картинки

Из данного рисунка видно, что и из данной картинки удалось выделить границы практически идеально (поскольку сама картинка размытая).

Выводы

Таким образом, подводя итог к проделанной работе, можно сделать вывод о том, что мною были изучены основы обработки изображений на примере методов фильтрации, реализуемых в спектральном пространстве на языке Python. Также были изучены некоторые разработанные ранее методы выделения границ объектов, такие как метод Собеля и метод Кенни. При сравнении всех методов между собой было получено, что наиболее восприимчивым фильтром к границам объектов является фильтр Собеля

Соседние файлы в предмете Мультимедиа технологии