Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

6

.pdf
Скачиваний:
5
Добавлен:
16.05.2025
Размер:
1 Мб
Скачать
☆

Рисунок 12 – Обработанное изображение

Рисунок 13 – Амплитудный спектр

с параметром среза частоты фильтра 0.40

обработанного изображения

После этого перейдем к обработке изображения посредством фильтрации Фурье-фильтром Баттерворта с оптимальным значением параметра частоты среза и последующей бинаризацией. Код такой программы представлен в Листинге 3. Результат обработки исходного изображения представлен на рисунках 14 и 15. Результат обработки изображения с рисунка

8 представлен на рисунках 16 и 17.

Листинг 3. Обработка изображения Фурье-фильтром Баттерворта с последующей

бинаризацией.

import cv2

import numpy as np

import matplotlib.pyplot as plt

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

input_image = cv2.imread('LR6.jpg')

#Преобразование изображения в черно-белое, чтобы работать только с гранями

L = cv2.cvtColor(input_image, cv2.COLOR_BGR2GRAY)

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

plt.figure()

plt.imshow(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB)) plt.title('Исходное изображение')

11

plt.axis('off') # Убираем оси plt.tight_layout()

plt.show()

#Выполнение двумерного центрированного БПФ для получения спектра

Spectr = np.fft.fftshift(np.fft.fft2(L))

#Вычисление компоненты нормировки

Min_S = np.min(np.abs(Spectr))

eps = Min_S if Min_S != 0 else np.max(np.abs(Spectr)) * 1e-9 # Защита от деления на ноль

# Фильтр высоких частот (ФВЧ) с маской Баттерворта M, N = L.shape # Получаем размеры изображения

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

#Формирование маски Баттерворта 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) # Формула Баттерворта

#Применяем маску Баттерворта к спектру

Spectr_high_pass_filtered = Spectr * 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 # Инвертирование изображения для акцента на краях

# Бинаризация результата

threshold_value = 0.75 # Порог для бинаризации

thr, edges_high_pass = cv2.threshold(edges_high_pass, threshold_value, 1.0, cv2.THRESH_BINARY)

# Визуализация результата бинаризации plt.figure()

plt.imshow(edges_high_pass, cmap='gray') plt.title('Бинаризованное изображение после ФВЧ') plt.axis('off') # Убираем оси

plt.tight_layout() plt.show()

12

# Вычисление амплитудного спектра после применения маски

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() plt.imshow(Spectr_dB, cmap='jet')

plt.title('Амплитудный спектр после ФВЧ (дБ)') plt.axis('off') # Убираем оси plt.tight_layout()

plt.show()

# Сохранение итогового бинаризованного изображения с нормировкой (яркость от 0 до 255)

cv2.imwrite('LR6.8.jpg', cv2.normalize((edges_high_pass * 255).astype('uint8'), None, 0, 255, cv2.NORM_MINMAX))

Рисунок 14 – Обработанное изображение

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

13

Рисунок 16 – Обработанное изображение

Рисунок 17 – Амплитудный спектр

 

обработанного изображения

Метод Кэнни для фильтрации изображения обеспечивает высокое качество выделения границ, делая их более четкими и четко очерченными.

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

После применения данного метода границы изображения становятся исключительно четкими, что значительно улучшает возможности для их дальнейшей параметризации и анализа. Это свойство делает метод Кэнни идеальным выбором для задач, требующих высокой степени детализации,

включая обработку и анализ изображений в различных областях, таких как компьютерное зрение и машинное обучение. Программный код показан в листинге 4. Результаты реализации на рисунках 18 и 19.

Листинг 4. Программа обработки изображения при помощи метода Кэнни,

выделяющего края объектов

import cv2

import numpy as np

14

import matplotlib.pyplot as plt

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

input_image = cv2.imread('LR6.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()

#Применяем оператор Кэнни для обнаружения границ

#Параметры threshold1 и threshold2 можно настраивать

edges_canny = cv2.Canny(input_image, threshold1=50, threshold2=150)

#Инвертируем изображение, чтобы акцентировать границы edges_canny = 255 - edges_canny

#Визуализация результата работы оператора Кэнни plt.figure()

plt.imshow(edges_canny, cmap='gray') plt.title('Оператор Кэнни') plt.axis('off') # Убираем оси plt.tight_layout()

plt.show()

#Сохранение итогового бинаризованного изображения с нормировкой (яркость от

0 до 255)

cv2.imwrite('LR6.7.jpg', edges_canny)

#Визуализация амплитудного спектра (если необходимо, в противном случае этот шаг можно убрать)

#Для завершения процесса, можно показать, как изменился результат сравнения с оригиналом

Spectr_dB = 20 * np.log10(np.abs(np.fft.fftshift(np.fft.fft2(L))) + 1e-9)

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

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

#Визуализация амплитудного спектра

plt.figure() plt.imshow(Spectr_dB, cmap='jet')

plt.title('Амплитудный спектр (дБ)') plt.axis('off') # Убираем оси plt.tight_layout()

plt.show()

15

Рисунок 18 – Обработанное изображение

Рисунок 19 – Амплитудный спектр

 

обработанного изображения

16

Вывод Применение методов фильтрации, таких как фильтр Фурье,

продемонстрировало свою эффективность в улучшении качества изображений. Личное оптимальное значение среза, равное 20, по моему мнению, оказало наилучший эффект, позволяя добиться стабильного качества изображения с явным улучшением результатов бинаризации. Применение бинаризации не улучшило качество изображения.

Кроме того, метод Кэнни стал значимым инструментом в арсенале инструментов обработки изображений. Его способность точно выделять границы делает процесс работы с изображениями, более захватывающим и продуктивным. Я получила удовольствие от работы с данным методом, и

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

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

Ссылка на изображения: https://drive.google.com/drive/folders/1- T1Y_1foDcRzw5ROi7un1AuykKyI-kU1?usp=drive_link

17

Список используемых источников:

1.Основы цифровой обработки изображений: учеб. пособие / Жаринов О.О. СПб: ГУАП, 2023. – 122 с.

2.Binarize image with Python, NumPy, OpenCV // URL: https://note.nkmk.me/en/python-numpy-opencv-image-binarization/

3.Opencv Edge Detection / S.Jones. 2023. // URL: https://www.mo4tech.com/opencv-edge-detection.html

4.Digital image processing 100 question -19 LOG filter // URL: https://programmersought.com/article/297511641467/

5.Python Image Processing OpenCV / D.Wright. 2024. // URL: https://www.mo4tech.com/python-image-processing-opencv-12-roberts- operatorprewitt-operator-sobel-operator-and-laplacian-operator-edge- etectiontechniques.html

6.Жаринов О.О. Учебно-методические материалы к выполнению лабораторной работы №6 по дисциплине “Мультимедиа-технологии“, гр. Z0411, ГУАП, 2025. – 12 с.

18

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