Размытие по рамке (известное также как рамочный линейный фильтр) — это линейный фильтр пространственной области, в котором каждый пиксель в результирующем изображении имеет значение, равное среднему значению соседних пикселей во входном изображении. Это форма фильтра нижних частот («размытия»). Размытие по рамке 3 на 3 («радиус 1») можно записать как матрицу
Благодаря свойству использования равных весов его можно реализовать с помощью гораздо более простого алгоритма накопления, который значительно быстрее, чем использование алгоритма скользящего окна.
Размытия по рамке часто используется для аппроксимации размытия по Гауссу. Согласно центральной предельной теореме многократное применение размытия по рамке будет аппроксимировать размытие по Гауссу.
В частотной области размытие по рамке имеет нули и отрицательные компоненты. То есть синусоида с периодом, равным размеру окна, будет полностью размыта, а длины волн короче размера окна могут быть инвертированы по фазе, как видно, когда два круга боке соприкасаются, образуя яркое пятно там, где было бы темное пятно между двумя яркими пятнами в исходном изображении.
Расширения Гвождек и соавторы расширили размытие по рамке, добавив возможность использования дробного радиуса: края одномерного фильтра расширяются на дробную часть. Это позволяет получить немного лучшее приближение Гаусса за счет устранения ошибок округления до целых чисел. Марио Клингеманн разработал «стековое размытие», которое пытается лучше имитировать вид гауссиана в один проход, складывая веса: . Формируемая им треугольная импульсная характеристика разлагается на два раунда размытия по рамке. Метод «стекового интегрального изображения» Бхатии и соавторов использует взвешенное среднее нескольких размытий по рамке для подгонки кривой отклика.
Реализация
Следующий псевдокод реализует 3x3 размытие по рамке. Box blur (image) { set newImage to image;
For x /*row*/, y/*column*/ on newImage do:
If x < 1 or y < 1 or x + 1 == width or y + 1 == height then: Continue; // Устанавливаем P как среднее 9 пикселей: X X X X P X X X X // Вычисляем среднее. Sum = image[x - 1, y + 1] + // Верхний левыйt image[x + 0, y + 1] + // Верхний центральный image[x + 1, y + 1] + // Верхний правый image[x - 1, y + 0] + // Средний левый image[x + 0, y + 0] + // Текущий пиксель image[x + 1, y + 0] + // Средний правый image[x - 1, y - 1] + // Нижний левыйt image[x + 0, y - 1] + // Нижний центральный image[x + 1, y - 1]; // Нижний правый
newImage[x, y] = Sum / 9;
Return newImage; }
Пример не обрабатывает края изображения, которые не помещаются в ядро, поэтому эти области остаются неразмытыми. На практике эта проблема лучше решается следующими способами: Введение альфа-канала для представления отсутствия цветов; Расширение границы путём заполнения значений, ранжированных по качеству: Заполнение зеркальным изображением на границе Заполнение постоянным цветом, исходящим из последнего пикселя Заполнение фиксированным цветом
При реализации размытия по рамке с радиусом r и N пикселями можно применить ряд оптимизаций: Размытие по рамке является , поэтому для каждого пикселя потребуется всего два одномерных прохода усреднения пикселей — один горизонтальный и один вертикальный. Это снижает сложность с до . В терминологии цифроваой обработки сигналов каждый проход является фильтром скользящего среднего. Накопление. Вместо сбрасывания суммы для каждого пикселя алгоритм повторно использует предыдущую сумму и обновляет её, вычитая старый пиксель и добавляя новый. Аналогично можно использовать . Это снижает сложность с до . При использовании в нескольких проходах для аппроксимации размытия по Гауссу, конструкция позволяет выполнять эквивалентную операцию за один проход.
См. также Размытие по Гауссу Фильтр Гаусса Медианный фильтр
Примечания
Категория:Обработка изображений