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

Выводы:

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

Реализованы и опробованы на практике простейший фильтр низких частот на основе Фурье фильтрации, Фурье фильтр на с использованием метода Баттерворда, быстрый фильтр при использовании оператора Кэнни.

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

Изучены особенности влияния пространственной частоты среза на результаты фильтрации. Подобран оптимальный вариант для получения контура шахматных фигур на исходном изображении при использовании фильтра Баттерворда (частота среза 0.25) и бинаризации.

Список использованных источников

1. Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №6 по дисциплине “Мультимедиа-технологии “. гр.4116,4117, 4118, Z0411. ГУАП, 2025. – 19 с. (Интернет-ресурс): //URL:

https://pro.guap.ru/inside/student/tasks/c60a6f0196d936e0858a3c49140baf64/download

(Дата обращения 25.03.2025)

2. Использование оператора Кэнни Opencv Edge Detection / S.Jones. 2023. (Интернет-ресурс): // URL:

https://www.mo4tech.com/opencv-edge-detection.html

(Дата обращения 25.03.2025)

ПРИЛОЖЕНИЕ А — ПОЛНЫЙ КОД

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

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

def img_filter(L, filter, d_high_k, title, is_binarization=False):

Spectr, Spectr_dB = get_spectr(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(d_high_k * np.minimum(M, N))

mask_high = filter(M, N, d_high)

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 # инвертировали

# бинаризация

if is_binarization:

edges_high_pass = binarization(edges_high_pass, 0.8)

# отображение результата

plot_img(edges_high_pass, ('ФНЧ: ', title, ' срез = ' , d_high_k))

# амплитудный спектр после применения маски:

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

Spectr_dB[0,0] = 20*np.log10(np.max(np.abs(Spectr)))

# вывод нового спектра

plot_spectr(Spectr_dB, ('Амплитудный спектр после ФВЧ ' , title, ' срез = ' , d_high_k))

# нормировка яркости

cv2.imwrite('edges_high_pass.jpg',

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

Spectr, Spectr_dB = get_spectr(L)

plot_spectr(Spectr_dB, 'Исходный спектр')

img_filter(L, simple_fft, 0.1, "Простая фильтрация") # простейшая Фурье Фильтрация

img_filter(L, simple_fft, 2, "Простая фильтрация") # простейшая Фурье Фильтрация

img_filter(L, butter_fft, 0.02, "Фильтр Баттерворта") # Фурье Фильтрация Баттерворта

img_filter(L, butter_fft, 0.5, "Фильтр Баттерворта") # Фурье Фильтрация Баттерворта

img_filter(L, butter_fft, 1, "Фильтр Баттерворта") # Фурье Фильтрация Баттерворта

img_filter(L, butter_fft, 0.25, "Фильтр Баттерворта + биннаризация", True) # Фурье Фильтрация Баттерворта

#canny(input_image) # оператор Кэнни