
Выводы:
В результате выполнения лабораторной работы изучены основы обработки изображений на примере методов фильтрации, реализуемых в спектральном пространстве.
Реализованы и опробованы на практике простейший фильтр низких частот на основе Фурье фильтрации, Фурье фильтр на с использованием метода Баттерворда, быстрый фильтр при использовании оператора Кэнни.
Изучен принцип и действие метода бинаризации, позволяющей повысить чёткость полутонны изображений.
Изучены особенности влияния пространственной частоты среза на результаты фильтрации. Подобран оптимальный вариант для получения контура шахматных фигур на исходном изображении при использовании фильтра Баттерворда (частота среза 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) # оператор Кэнни