Открыть сервис

Билатеральный фильтр

Билатеральный фильтр — это нелинейный фильтр для обработки изображений и сигналов, который сглаживает изображение, сохраняя при этом резкие границы (края). В отличие от классического гауссова фильтра, который усредняет значения пикселей только на основе их пространственной близости, билатеральный фильтр учитывает также разницу в их интенсивности (цвете). Это позволяет удалять шум и мелкие детали, не размывая контуры объектов.

Принцип работы

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

Математическая формулировка

Для пикселя с координатами \((i, j)\) и интенсивностью \(I(i, j)\) отфильтрованное значение \(I_{\text{filtered}}(i, j)\) вычисляется по формуле:

\[ I_{\text{filtered}}(i, j) = \frac{1}{W(i, j)} \sum_{k, l} I(k, l) \cdot w_s(i, j, k, l) \cdot w_r(i, j, k, l) \]

где:

  • \(W(i, j)\) — нормирующий коэффициент (сумма всех весов).
  • \(w_s(i, j, k, l) = \exp\left(-\frac{(i-k)^2 + (j-l)^2}{2\sigma_s^2}\right)\) — пространственный вес, зависящий от расстояния между пикселями.
  • \(w_r(i, j, k, l) = \exp\left(-\frac{|I(i, j) - I(k, l)|^2}{2\sigma_r^2}\right)\) — цветовой (радиометрический) вес, зависящий от разницы в интенсивности.
  • \(\sigma_s\) — параметр, определяющий радиус пространственного сглаживания.
  • \(\sigma_r\) — параметр, определяющий порог чувствительности к перепадам яркости.

Роль параметров

  • \(\sigma_s\) (пространственная сигма): Контролирует размер окрестности, из которой берутся пиксели для усреднения. Большое значение \(\sigma_s\) приводит к более сильному сглаживанию, но и к большему размытию мелких деталей. Измеряется в пикселях.
  • \(\sigma_r\) (цветовая сигма): Определяет, насколько сильно различающиеся по яркости пиксели будут влиять друг на друга. Малое значение \(\sigma_r\) заставляет фильтр игнорировать пиксели, которые сильно отличаются по цвету, тем самым лучше сохраняя границы. Большое значение \(\sigma_r\) делает фильтр более похожим на обычный гауссов фильтр.

История

Концепция билатерального фильтра была впервые предложена в 1995 году в работе «Nonlinear Gaussian Filters» (Аурих, Вайгерт, и др.) и независимо в 1998 году в статье «Bilateral Filtering for Gray and Color Images» (Томази и Мандучи). Последняя работа получила широкое признание и популяризировала метод в компьютерном зрении и компьютерной графике. Изначально фильтр применялся для обработки чёрно-белых изображений, но быстро был адаптирован для цветных (RGB) и многоканальных изображений.

Применение

Билатеральный фильтр нашёл применение в широком спектре задач обработки изображений и компьютерного зрения.

Удаление шума (Denoising)

Основное и наиболее распространённое применение. Фильтр эффективно подавляет гауссов шум, а также шум типа «соль и перец», при этом не размывая границы объектов. Это делает его предпочтительнее линейных фильтров для задач, где важна чёткость контуров.

Упрощение изображения (Image Abstraction)

Путём сильного сглаживания (большое \(\sigma_s\) и \(\sigma_r\)) можно добиться эффекта «картины маслом» или «мультипликации», когда мелкие текстуры удаляются, а крупные цветовые области остаются с чёткими границами. Этот приём используется в не фотореалистичном рендеринге (NPR).

Тональная компрессия (HDR Tone Mapping)

При отображении изображений с высоким динамическим диапазоном (HDR) на устройствах с низким динамическим диапазоном (LDR) билатеральный фильтр используется для разделения изображения на базовый слой (крупные перепады яркости) и детальный слой (мелкие текстуры). Сжимая контраст базового слоя и сохраняя детали, можно получить реалистичное LDR-изображение.

Улучшение текстур (Texture Filtering)

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

Стерео и оптический поток

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

Разновидности и оптимизации

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

  • Билатеральный фильтр с использованием гистограммы (Histogram-based Bilateral Filter): Позволяет ускорить вычисления за счёт группировки пикселей по интенсивности.
  • Билатеральный фильтр на основе совместного двумерного преобразования (Joint Bilateral Filter): Использует второе (направляющее) изображение для определения цветовых весов, что позволяет, например, сглаживать карту глубины, используя в качестве направляющего цветное изображение.
  • Билатеральный фильтр с адаптивным окном (Adaptive Bilateral Filter): Размер окна и параметры \(\sigma\) могут меняться в зависимости от локальных характеристик изображения.
  • Билатеральный фильтр на основе быстрого преобразования Фурье (FFT-based Bilateral Filter): Использует свойства свёртки для ускорения, но применим только для определённых типов изображений.

Сравнение с другими фильтрами

  • Гауссов фильтр: Линейный фильтр, который сглаживает всё, включая границы. Билатеральный фильтр является его нелинейным расширением.
  • Медианный фильтр: Нелинейный фильтр, эффективный против импульсного шума, но может искажать тонкие линии и границы. Билатеральный фильтр лучше сохраняет детали.
  • Фильтр анизотропной диффузии: Итеративный метод, который также стремится сохранить границы, но может быть более сложным в настройке и медленным. Билатеральный фильтр является неитеративным и проще в реализации.
  • Фильтр на основе нелокальных сред (Non-local Means): Более современный и мощный метод, который ищет похожие паттерны по всему изображению, а не только в локальной окрестности. Он даёт лучшие результаты по качеству, но значительно медленнее.

Реализация

Билатеральный фильтр реализован во всех основных библиотеках компьютерного зрения и обработки изображений:

  • OpenCV: Функция cv2.bilateralFilter().
  • MATLAB: Функция imbilatfilt().
  • Python (scikit-image): Функция skimage.restoration.denoise_bilateral().
  • Adobe Photoshop: Фильтр «Размытие по поверхности» (Surface Blur) основан на принципе билатерального фильтра.

Критика и ограничения

  • Вычислительная сложность: Как уже упоминалось, классическая реализация медленна для больших изображений и больших значений \(\sigma_s\).
  • Эффект «ступенек» (Gradient Reversal): В областях с плавными градиентами фильтр может создавать ложные контуры, так как он интерпретирует плавный переход как набор резких ступенек.
  • Чувствительность к параметрам: Неправильный выбор \(\sigma_s\) и \(\sigma_r\) может привести либо к недостаточному сглаживанию, либо к размытию границ. Настройка параметров часто требует ручного подбора.

Источники

  1. Tomasi, C., & Manduchi, R. (1998). Bilateral filtering for gray and color images. Proceedings of the Sixth International Conference on Computer Vision.
  2. Paris, S., Kornprobst, P., Tumblin, J., & Durand, F. (2009). Bilateral Filtering: Theory and Applications. Now Publishers Inc.
  3. Gonzalez, R. C., & Woods, R. E. (2018). Digital Image Processing (4th ed.). Pearson.
  4. Szeliski, R. (2010). Computer Vision: Algorithms and Applications. Springer.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →