Замыливание картинки
Следующим этапом при выполнении данной лабораторной работы необходимо взять исходную картинку и уменьшить её резкость. Для замыливания изображения в 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 – Сравнение результата понижения четкости
Из данных рисунков видно, что картинка стала гораздо менее четкой, что видно по спектру изображения.