Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мультимедиа6.docx
Скачиваний:
9
Добавлен:
20.06.2025
Размер:
6 Мб
Скачать
☆

Ход работы

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

Рисунок 1- Исходное изображение

Для визуализации амплитудного спектра изображения исходное изображение преобразуется в цветовое пространство LAB, из которого извлекается компонента яркости L. Затем выполняется двумерное преобразование Фурье с центрированием спектра (Рисунок 2).

Листинг 1 - Вычисление двумерного центрированного спектра изображения и визуализация соответствующего амплитудного спектра

import cv2

import numpy as np

import matplotlib.pyplot as plt

# Чтение изображения

input_image = cv2.imread("C:/j.jpg")

LAB_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2LAB)

# это мы перевели в LAB

L = LAB_image[:, :, 0]/100 # выделяем матрицу яркости

# Визуализация исходного изображения

plt.figure(figsize=(8, 6))

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))

eps = np.max(np.abs(Spectr)) * 1e-9

Spectr_dB = 20 * np.log10(np.abs(Spectr) + eps)

plt.figure(figsize=(8, 6))

im = plt.imshow(Spectr_dB, cmap='jet', extent=[-0.5, 0.5, -0.5, 0.5])

plt.title('Амплитудный спектр (дБ)')

plt.xlabel('Частота')

plt.ylabel('Частота')

plt.axis('on')

plt.colorbar(im, label='Амплитуда (дБ)')

plt.tight_layout()

plt.show()

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

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

Затем был реализован метод фильтрации изображения в спектральном пространстве для выделения границ. Согласно методическим указаниям, для получения информации о частотном составе изображения применяется двумерное быстрое преобразование, реализованное с помощью функции fft2(). Формируется частотная маска фильтра высоких частот с разными параметрами частоты среза, для сравнения, от минимального размера изображения. После применения маски к спектру выполняется обратное преобразование Фурье, результат нормируется и инвертируется для получения более наглядного представления границ (Рисунок 3-7).

Листинг 2 – Программа, реализующая простейший способ реализации метода Фурье-фильтрации изображения с целью выделения краев объектов

import cv2

import numpy as np

import matplotlib.pyplot as plt

# Чтение изображения

input_image = cv2.imread("C:/j.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))

if Min_S != 0:

eps = Min_S

else:

eps = np.max(np.abs(Spectr)) * 1e-9

# Фильтр высоких частот (ФВЧ) с прямоугольной маской

M, N = L.shape[0], L.shape[1] # размеры изображения

# размер области НЧ в спектре, подбираем константу вручную

d_high = round(0.20*np.minimum(M, N))

# определяем граничные индексы, исходя из требований симметрии

# и учитывая чет и нечет для M и N

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 = np.fft.fftshift(np.fft.fft2(L))

Spectr_high_pass_filtered *= 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(figsize=(8, 6))

im = plt.imshow(Spectr_dB, cmap='jet', extent=[-0.5, 0.5, -0.5, 0.5])

plt.title('Амплитудный спектр после ФВЧ (дБ)')

plt.xlabel('Частота')

plt.ylabel('Частота')

plt.axis('on')

plt.colorbar(im, label='Амплитуда (дБ)')

plt.tight_layout()

plt.show()

cv2.imwrite('edges_high_pass.jpg',

cv2.normalize((edges_high_pass*255).astype('uint8'),

None, 0, 255, cv2.NORM_MINMAX))

Рисунок 3- Изображение после применения ФВЧ с параметром частоты среза 0.1

Рисунок 4- Амплитудный спектр после примененич ФВЧ с параметром частоты среза 0.1

Рисунок 5- Изображение после применения ФВЧ с параметром частоты реза 0.4

Рисунок 6- Амплитудный спектр после примененич ФВЧ с параметром частоты среза 0.4

Рисунок 7- Изображения после применения ФВЧ с параметром частоты среза 0.1 (слева) и 0.4 (справа)

После применения фильтрации с параемтром среза 0.1 выходное изображение выглядит более четким, чем выходное изображение после фильтра с параметром среза 0.4. На втором изображении мелкие буквы сливаются. На обоих изображениях присутствует шум.

Далее реализована обработка изображения с помощью фильтра высоких частот Баттерворта для выделения краев объектов. . Создается маска фильтра Баттерворта с раными параметрами частоты среза от минимального размера изображения и порядком 4, которая умножается на спектр изображения (Рисунок 8- 12).

Листинг 3 - Фрагмент программы, в которой реализован метод Фурье-фильтрации изображения посредством формирования маски фильтра на основе ФВЧ Баттерворта

M, N = L.shape[0], L.shape[1] # размеры изображения

# размер области НЧ в спектре:

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 # координаты центра маски

# формируем массив mask_high_b:

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)

Рисунок 8- Изображение после применения Фурье-фильтра Баттерворта со значением 0.2

Рисунок 9- Амплитудный спектр изображения после применения Фурье-фильтра Баттерворта со значением 0.2

Рисунок 10- Изображение после применения Фурье-фильтра Баттерворта со значением 0.7

Рисунок 11- Амплитудный спектр изображения после применения Фурье-фильтра Баттерворта со значением 0.7

Рисунок 12- Изображения после применения Фурье-фильтра Баттерворта со значением 0.2 (слева) и 0.7 (справа)

Сравнивая разные параметры частоты среза для Фурье-фильтра Баттерворта, можно сказать, что значение 0,2 даёт лучший результат, оно правильно балансирует между подавлением низких частот и сохранением высоких, не подавляя слишком много информации. При значении частоты среза 0.7 фильтр слишком агрессивно подавляет частоты, весь спектр становится синий, что приводит к плохому качеству выделения контуров на изображении. По сравнению с простейшим способом реализации метода Фурье-фильтрации, данный метод убирает шум с изображения.

Для улучшения качества добавлена бинаризация изображения после фильтрации (Рисунок 13-15).

Листинг 4 - Использование метода бинаризации изображения

threshold_value = 0.87

thr, edges_high_pass = cv2.threshold(

edges_high_pass, threshold_value, 1.0, cv2.THRESH_BINARY)

Рисунок 13 – Изображение после применения Фурье-Фильтра Баттерворта со значением 0.2 и бинаризацией

Рисунок 14- Амплитудный спектр изображения после применения Фурье-Фильтра Баттерворта со значением 0.2 и бинаризацией

Рисунок 15- Исходное изображение и изображение после применения Фурье-Фильтра Баттерворта со значением 0.2 и бинаризацией

Можно сказать, что намного улучшилось качество выделения контуров. После применения бинаризации получается четкое черно-белое изображение, контуры объектов становятся более четкими и убираются шумы. Остаются только самые яркие края.

Далее использовался оператор Щарра для выделения краев объектов [2]. Оператор Шарра является улучшенной версией оператора Собеля и используется для выделения краев на изображениях. Вычисляются градиенты по X и Y направлениям с помощью оператора Щарра. Полученные градиенты преобразуются в абсолютные значения и объединяются с равными весами. Результат инвертируется для соответствия с предыдущими методами обработки [3].

Листинг 5 - Обработка изображения методом Щарра

# Обработка методом Шарра

scharrx = cv2.Scharr(L, cv2.CV_64F, 1, 0)

scharry = cv2.Scharr(L, cv2.CV_64F, 0, 1)

scharrx = cv2.convertScaleAbs(scharrx)

scharry = cv2.convertScaleAbs(scharry)

scharr = cv2.addWeighted(scharrx, 0.5, scharry, 0.5, 0)

scharr = 255 - scharr # инвертируем

Рисунок 16- Изображение после применения оператора Щарра

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

Рисунок 18- Изображение после применения Фурье-Фильтра Баттерворта со значением 0.2 и бинаризацией и изображение после применения оператора Щарра

По сравнения с самым четким изображением полученным ранее, выходное изображение после применения оператора Щарра более четкое и детально выделяет края. На небе стали наблюдаться слои кругов, которых раньше не было. Оператор Шарра дает лучшие результаты по сравнению с Фурье-фильтрацией.

Вывод

В ходе выполнения лабораторной работы были изучены и реализованы различные методы обработки изображений. Были реализованы и протестированы различные методы фильтрации: простой Фурье-фильтр с прямоугольной маской, фильтр Баттерворта и оператор Шарра. При использовании Фурье-фильтра с прямоугольной маской были получены результаты с заметным шумом и нечеткими конутрами. Фильтр Баттерворта показал лучшие результаты, особенно при частоте среза 0.2, однако при увеличении частоты среза до 0.7 наблюдалось слишком агрессивное подавление частот. Дополнительное применение бинаризации значительно улучшило качество выделения контуров. Наиболее эффективным методом оказался оператор Шарра, который обеспечил более четкое и детальное выделение краев.

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