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

Замыливание картинки

Следующим этапом при выполнении данной лабораторной работы необходимо взять исходную картинку и уменьшить её резкость. Для замыливания изображения в MATLAB существует функция fspecial, которая создаёт маску, благодаря которой происходит размытие картинок. По варианту задания необходимо создать маску сферической расфокусировки, а в Python не существует функции создания такой маски, то пришлось вручную переписывать данную функцию из MATLAB в Python. Таким образом, в таблице 2 показан список используемых переменных, а в листинге 2 – программный код функции.

Таблица 2. Список используемых переменных

Название

Тип

Описание

PSF

Двумерный массив

Созданная сферическая маска

Distorted_image

Двумерный массив

Изображение после применения маски

img

Двумерный массив

Исходное изображение

Bluring_image

Функция

Функция замыливания картинки

Fspecial_disk_selfmade

Функция

Переписанная функция создания маски

Листинг 2. Функция расфокусировки изображения

# Функция создания маски для сферической расфокусировки

def fspecial_disk_selfmade(p2):

rad = p2

crad = int(np.ceil(rad - 0.5))

x_min, x_max = -crad, crad

y_min, y_max = -crad, crad

x, y = np.meshgrid(np.arange(x_min, x_max + 1), np.arange(y_min, y_max + 1))

maxxy = np.maximum(np.abs(x), np.abs(y))

minxy = np.minimum(np.abs(x), np.abs(y))

m1 = np.where(rad**2 < (maxxy + 0.5)**2 + (minxy - 0.5)**2, (minxy - 0.5), np.sqrt(np.abs(rad**2 - (maxxy + 0.5)**2)))

m2 = np.where(rad**2 > (maxxy - 0.5)**2 + (minxy + 0.5)**2, (minxy + 0.5), np.sqrt(np.abs(rad**2 - (maxxy - 0.5)**2)))

term1 = rad**2 * (0.5 * (np.arcsin(m2/rad) - np.arcsin(m1/rad)) + 0.25 * (np.sin(2*np.arcsin(m2/rad)) - np.sin(2*np.arcsin(m1/rad))))

term2 = (maxxy-0.5) * (m2-m1)

term3 = (m1-minxy+0.5)

mask = (((rad**2 < (maxxy+0.5)**2 + (minxy+0.5)**2) & (rad**2 > (maxxy-0.5)**2 + (minxy-0.5)**2)) | ((minxy==0) & (maxxy-0.5 < rad) & (maxxy+0.5>=rad)))

sgrid = (term1 - term2 + term3) * mask

sgrid += ((maxxy+0.5)**2 + (minxy+0.5)**2 < rad**2)

sgrid[crad+1, crad+1] = min(np.pi*rad**2, np.pi/2)

if crad > 0 and rad > crad-0.5 and rad**2 < (crad-0.5)**2+0.25:

m1 = np.sqrt(rad**2 - (crad - 0.5)**2)

m1n = m1/rad

sg0 = 2 * (rad**2 * (0.5*np.arcsin(m1n) + 0.25*np.sin(2*np.arcsin(m1n))) - m1 * (crad-0.5))

sgrid[2*crad+1, crad+1] = sg0

sgrid[crad+1, 2*crad+1] = sg0

sgrid[crad+1, 1] = sg0

sgrid[1, crad+1] = sg0

sgrid[2*crad, crad+1] -= sg0

sgrid[crad+1, 2*crad] -= sg0

sgrid[crad+1, 2] -= sg0

sgrid[2, crad+1] -= sg0

sgrid[crad+1, crad+1] = min(sgrid[crad+1, crad+1], 1)

h = sgrid / np.sum(sgrid)

return h

# Функция размыливания картинки

def bluring_image(img, radius: int):

PSF = fspecial_disk_selfmade(radius)

distorted_image = cv2.filter2D(img, -1, PSF)

return distorted_image

Далее необходимо протестировать замыливание картинки на исходном изображении. Таким образом на рисунке 6 показана замыленная картинка со спектром изображения, а на рисунке 7 – сравнение исходного изображения с результатом замыливания.

Рисунок 6 – Понижение четкости (intense = 5)

Рисунок 7 – Сравнение результата понижения четкости

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

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