Рубрики

Python | Двусторонняя фильтрация

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

Gaussian Blur

Размытие по Гауссу можно сформулировать следующим образом:

Вот, является результатом в пикселе p , а RHS по существу является суммой по всем пикселям q, взвешенным по функции Гаусса. интенсивность в пикселе q .

Двусторонний фильтр: дополнительный крайний срок

Двусторонний фильтр можно сформулировать следующим образом:

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

В OpenCV есть функция двусторонняя фильтрация со следующими аргументами:

  1. d: диаметр каждой окрестности пикселя.
  2. sigmaColor: значение в цветовом пространстве. Чем больше значение, тем больше цветов будут смешиваться друг с другом.
  3. sigmaColor: значение в координатном пространстве. Чем больше его значение, тем больше пикселей будут смешиваться вместе, учитывая, что их цвета находятся в пределах диапазона sigmaColor.

Код:
Вход: шумное изображение.

Код: внедрение двусторонней фильтрации

import cv2

  
# Прочитайте изображение.

img = cv2.imread('taj.jpg')

  
# Применяем двусторонний фильтр с d = 15,
# sigmaColor = sigmaSpace = 75.

bilateral = cv2.bilateralFilter(img, 15, 75, 75)

  
# Сохранить вывод.

cv2.imwrite('taj_bilateral.jpg', bilateral)

Выход двустороннего фильтра

Сравнение со средним и медианным фильтрами
Ниже приведен вывод среднего фильтра ( cv2.blur(img, (5, 5)) ).

Ниже приведен вывод медианного фильтра ( cv2.medianBlur(img, 5) ).

Ниже представлен результат фильтра Гаусса ( cv2.GaussianBlur(img, (5, 5), 0) ).

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

Рекомендуемые посты:

Python | Двусторонняя фильтрация

0.00 (0%) 0 votes