Билатеральный фильтр
Билатеральный фильтр — это нелинейный фильтр для обработки изображений и сигналов, который сглаживает изображение, сохраняя при этом резкие границы (края). В отличие от классического гауссова фильтра, который усредняет значения пикселей только на основе их пространственной близости, билатеральный фильтр учитывает также разницу в их интенсивности (цвете). Это позволяет удалять шум и мелкие детали, не размывая контуры объектов.
Принцип работы
Билатеральный фильтр сочетает в себе два взвешивающих фактора: пространственное (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\) может привести либо к недостаточному сглаживанию, либо к размытию границ. Настройка параметров часто требует ручного подбора.
Источники
- Tomasi, C., & Manduchi, R. (1998). Bilateral filtering for gray and color images. Proceedings of the Sixth International Conference on Computer Vision.
- Paris, S., Kornprobst, P., Tumblin, J., & Durand, F. (2009). Bilateral Filtering: Theory and Applications. Now Publishers Inc.
- Gonzalez, R. C., & Woods, R. E. (2018). Digital Image Processing (4th ed.). Pearson.
- Szeliski, R. (2010). Computer Vision: Algorithms and Applications. Springer.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →