Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МТ7.docx
Скачиваний:
1
Добавлен:
04.05.2025
Размер:
12.82 Mб
Скачать

ГУАП

КАФЕДРА № 41

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

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

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

О.О. Жаринов

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

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

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

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

Основы цифровой фильтрации изображений. Пространственные фильтры

по курсу: МУЛЬТИМЕДИА ТЕХНОЛОГИИ

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

СТУДЕНТ гр. №

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

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

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

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

Краткие теоретические сведения о задачах обработки изображений и их практическом применении:

Фильтрация является одним из широко применяемых методов обработки изображений. Концептуальные идеи, положенные в основу методов фильтрации изображений, опираются на методологическую базу обработки одномерных сигналов. Фильтрацию изображений можно производить без вычисления спектра изображения, непосредственно в пространстве значений пикселей, составляющих изображение. Математически принцип линейной пространственной фильтрации изображения, представленного матрицей {I[m,n]}, описывается формулой (7.1).

где массив коэффициентов {H[p,q]}p=−P,...P; q=−Q,...Q называется маской или ядром (kernel) фильтра и полностью определяет его свойства. В программах обработки изображений для задания массива маски часто используется идентификатор PSF (англ. Point Spread Function – функция рассеяния точки). Размер маски в (7.1) составляет (2P+1) на (2Q+1) элементов. Обычно размер маски выбирают небольшим, чаще всего задают P=Q=1, т. е. в этом случае маска представляет собой массив размера 3×3.

Таким образом, пространственная фильтрация предполагает выполнение операции взвешенного суммирования значений пикселей исходного изображения в некоторой окрестности для каждого пикселя для всех индексов n и m. Нужно заметить, что при программной реализации (7.1) приходится несколько видоизменить индексацию, чтобы избежать отрицательных значений индексов массива в самой маске и при обработке краев изображения, хотя при вызове библиотечных методов Python [2-5] об этой особенности можно вовсе не задумываться.

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

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

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

где выбор положительной константы с следует производить, ориентируясь на получаемый результат: при c ≈ 0 коррекция будет неощутима, а при чрезмерном ее увеличении («перекоррекции») каждый, даже мелкий, объект в выходном изображении получит окантовки по периметру, и полученное изображение будет восприниматься хуже исходного.

Вариант 13:

На рисунке 1 представлен вариант маски искажений.

Рисунок 1 – Маска искажений

Ход работы:

Для выполнения лабораторной работы было выбрано изображение разворота книги с текстом и иллюстрацией (Рисунок 2).

Рисунок 2 – Выбранное изображение

Для размытия изображения была разработана программа (Листинг 1). На первом этапе программа загружает исходное изображение в формате BGR с использованием функции imread из библиотеки OpenCV. Затем изображение нормируется, переводясь в формат с плавающей точкой и масштабируясь в диапазон [0,1].

Далее создаётся функция blur_mask, которая генерирует искажающую маску в виде линейного размытия. Размер размытия (size) определяет длину размытой линии, а угол (angle) задаёт направление размытия в градусах. Маска сначала создаётся как строка единиц в центре нулевой матрицы, затем поворачивается с использованием warpAffine и нормируется.

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

Результат визуализируется с использованием библиотеки Matplotlib. Поскольку OpenCV работает с цветовым пространством BGR, перед отображением изображение преобразуется в RGB с помощью cvtColor.

Наконец, размытое изображение сохраняется в файл blur_image.jpg. Перед сохранением оно масштабируется обратно в диапазон [0,255] и нормализуется с использованием cv2.normalize, чтобы избежать потери информации при конверсии в целочисленный формат uint8.

Листинг 1 – Размытие изображения

import cv2

from skimage import restoration

import numpy as np

import matplotlib.pyplot as plt

# функция, создающая смаз:

# size - размер размаза в пикселях,

# angle - направление смаза, в градусах

def blur_mask(size, angle):

    k = np.zeros((size, size), dtype=np.float32)

    k[(size-1) // 2, :] = np.ones(size, dtype=np.float32)

    k = cv2.warpAffine(k,

                       cv2.getRotationMatrix2D((size/2-0.5, size/2-0.5),

                                               angle, 1.0),

                       (size, size))

    k = k/np.sum(k)  # нормировка

    return k

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

# нормировка данных изображения и перевод во float:

input_image = input_image.astype(np.float32)/255.

# задаем искажающую маску в виде матрицы:

PSF_blur = blur_mask(size=35, angle=35)

print(PSF_blur)  # посмотрим на искажающую маску

# и размажем ею изображение:

blur_image = cv2.filter2D(input_image, -1, PSF_blur)

# Визуализация искаженного смазом изображения:

plt.figure()

plt.imshow(cv2.cvtColor(blur_image, cv2.COLOR_BGR2RGB))

plt.title('Смазанное изображение')

plt.axis('off')

plt.tight_layout()

plt.show()

cv2.imwrite(

    "blur_image.jpg",

    cv2.normalize(

        (blur_image * 255).astype("uint8"), None, 0, 255, cv2.NORM_MINMAX

    ),

)

Размер размытия был выбран 35, угол также равен 35. Результат размытия изображения представлен на рисунке 3.

Рисунок 3 – Размытое изображение

Далее были разработаны программы для восстановления изображения методами Винеровской фильтрации и Ричардсона-Люси (Листинг 2, 3). Программа загружает размытое изображение blur_image.jpg с использованием функции imread из библиотеки OpenCV. Затем изображение нормируется, переводя его в формат с плавающей точкой и масштабируя в диапазон [0,1].

Далее программа применяются методы восстановления изображения. Первый метод — это инверсная Винеровская фильтрация, которая используется для устранения шума и восстановления деталей изображения. Уровень шума задается переменной noise_var. Восстановление выполняется по каждому цвету изображения (красный, зеленый и синий каналы) раздельно с помощью функции restoration.wiener из библиотеки skimage. Входными параметрами для Винеровской фильтрации являются размытое изображение, маска PSF и уровень шума.

После восстановления пиксели ограничиваются в диапазоне [0,1] с помощью функции np.clip, а затем масштабируются обратно в диапазон [0,255] и конвертируются в тип uint8 для корректного отображения и сохранения изображения.

В случае алгоритма Ричардсона-Люси, который выполняет итерационное восстановление изображения, количество итераций задается переменной its. Подобно Винеровской фильтрации, восстановление происходит по каждому цветовому каналу отдельно, но здесь используется функция restoration.richardson_lucy из той же библиотеки. Алгоритм поэтапно улучшает восстановление, минимизируя ошибки восстановления.

Листинг 2 – Восстановление Винеровской фильтрацией

blur_image = cv2.imread('blur_image.jpg').astype(np.float32)/255.

# Двумерная инверсная винеровская фильтрация

noise_var = 0.01  # подбор уровня шума

image_deblur = blur_image.copy()

# Обработка по трем цветовым каналам раздельно:

for i in range(3):

    image_deblur[:, :, i] = restoration.wiener(

        blur_image[:, :, i], PSF_blur, noise_var)

# ограничение и денормировка:

image_deblur = np.clip(image_deblur, 0., 1.)

image_deblur = (image_deblur*255.).astype(np.uint8)

Листинг 3 – Восстановление методом Ричардсона-Люси

blur_image = cv2.imread('blur_image.jpg').astype(np.float32)/255.

its = 20

image_deblur = blur_image.copy()

# Обработка по трем цветовым каналам раздельно:

for i in range(3):

    image_deblur[:, :, i] = restoration.richardson_lucy(blur_image[:, :, i],PSF_blur, num_iter=its)

# ограничение и денормировка:

image_deblur = np.clip(image_deblur, 0., 1.)

image_deblur = (image_deblur*255.).astype(np.uint8)

Выполнено восстановление Винеровской фильтрацией с уровнем шума 0.1 и алгоритмом Ричардсона-Люси с 10 и 20 итерациями, результаты представлены на рисунках 4 – 6. Оба метода использовали ту же маску, что использовалась для размытия.

Рисунок 4 – Изображение, восстановленное Винеровской фильтрацией

Рисунок 5 - Изображение, восстановленное алгоритмом Ричардсона-Люси с 10 итерациями

Рисунок 6 - Изображение, восстановленное алгоритмом Ричардсона-Люси с 20 итерациями

Метод Винеровской фильтрации позволил достичь хорошего результата: и текст и иллюстрация стали четко видны. Алгоритм Ричардсона-Люси немного повысил четкость изображения, текст можно разобрать, но общее визуальное восприятие осталось неудовлетворительным.

Было проведено восстановление с использованием маски, отличной от использованной для размытия, а именно с размером 32 и 15. Результаты представлены на рисунках 7 - 10.

Рисунок 7 – Изображение, восстановленное Винеровской фильтрацией с размером маски 32

Рисунок 8 – Изображение, восстановленное Винеровской фильтрацией с размером маски 15

Рисунок 9 - Изображение, восстановленное алгоритмом Ричардсона-Люси с 10 итерациями и размером маски 32

Рисунок 10 - Изображение, восстановленное алгоритмом Ричардсона-Люси с 10 итерациями и размером маски 15

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

Для получения смазанного изображеия намеренно была сделана фотография того же разворота книги в движении (Рисунок 11).

Рисунок 11 – Смазанная фотография

К этому изображению были применены ранее опробованные методы восстановления. Угол маски везде был равен 0 (на фото явно видно горизонтальное искажение). Результаты восстановления представлены на рисунках 12 - 14.

Рисунок 12 - Восстановление фильтром Винера, размер маски 7, noise_var 0.9

Рисунок 13 - Восстановление фильтром Винера, размер маски 15, noise_var 0.15

Рисунок 14 - Восстановление алгоритмом Ричардсона-Люси, итераций 20, размер маски 15

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

Полный код использованных программ представлен в приложении А.

Изображения повторно представлены в приложении Б.

Вывод: в ходе выполнения лабораторной работы были изучены основы обработки изображений на примере методов фильтрации с использованием пространственных фильтров. Успешно применено искажение и восстановление изображение с помощью маски. Опробованы метод фильтра Винера и алгоритм Ричардсона-Люси с различными параметрами. Искаженное программой изображение удалось восстановить, в этой задаче фильтр Винера показал себя лучше. При попытке восстановить намеренно искаженное при запечатлении фото, были получены слудующие результаты: текст удается различить лишь частично, иллюстрация же стала заметно четче, алгоритм Ричардсона-Люси предоставил менее зашумленное изображение.

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