Размытие коробки
Блок -размытие (также известный как прямоугольный линейный фильтр) — это линейный фильтр пространственной области, в котором каждый пиксель результирующего изображения имеет значение, равное среднему значению соседних пикселей во входном изображении. Это разновидность фильтра нижних частот («размытия»). Размытие прямоугольника 3 на 3 («радиус 1») можно записать в виде матрицы.
Благодаря свойству использования равных весов его можно реализовать с использованием гораздо более простого алгоритма накопления, который значительно быстрее, чем использование алгоритма скользящего окна. [1]
Размытие по прямоугольнику часто используется для аппроксимации размытия по Гауссу . [2] Согласно центральной предельной теореме , повторное применение размытия по квадрату будет аппроксимировать размытие по Гауссу. [3]
В частотной области размытие прямоугольника имеет нули и отрицательные компоненты. То есть синусоидальная волна с периодом, равным размеру прямоугольника, будет полностью размыта, а волны короче размера прямоугольника могут быть обращены по фазе, как это видно, когда два круга боке соприкасаются, образуя яркое пятно, где на исходном изображении между двумя яркими пятнами будет темное пятно.
Расширения
[ редактировать ]- Гвосдек и др. расширено размытие поля, чтобы получить дробный радиус: края 1-D фильтра расширяются на дробь. Это делает возможным немного лучшее гауссово приближение за счет устранения ошибки округления целых чисел. [3]
- У Марио Клингеманна есть «размытие стека», которое пытается лучше имитировать вид Гаусса за один проход путем наложения весов: [4] [5] Треугольная импульсная характеристика, которую он формирует, распадается на два раунда размытия поля. [3]
- Составное интегральное изображение, автор Bhatia et al. берет средневзвешенное значение нескольких размытий прямоугольников, чтобы соответствовать кривой гауссова отклика. [3]
Выполнение
[ редактировать ]Следующий псевдокод реализует размытие поля 3x3.
Box blur (image)
{
set newImage to image;
For x /*row*/, y/*column*/ on newImage do:
{
// Kernel would not fit!
If x < 1 or y < 1 or x + 1 == width or y + 1 == height then:
Continue;
// Set P to the average of 9 pixels:
X X X
X P X
X X X
// Calculate average.
Sum = image[x - 1, y + 1] + // Top left
image[x + 0, y + 1] + // Top center
image[x + 1, y + 1] + // Top right
image[x - 1, y + 0] + // Mid left
image[x + 0, y + 0] + // Current pixel
image[x + 1, y + 0] + // Mid right
image[x - 1, y - 1] + // Low left
image[x + 0, y - 1] + // Low center
image[x + 1, y - 1]; // Low right
newImage[x, y] = Sum / 9;
}
Return newImage;
}
В примере не обрабатываются края изображения, которые не помещаются внутри ядра, поэтому эти области остаются неразмытыми. На практике проблему лучше решить следующим образом: [3]
- Введение альфа-канала для обозначения отсутствия цветов;
- Расширение границы путем заполнения значений, ранжированных по качеству:
- Заполните зеркальное изображение на границе
- Заполните постоянным цветом, начиная с последнего пикселя.
- Подушка фиксированного цвета
можно применить ряд оптимизаций : При реализации размытия поля радиуса r и N пикселей [6]
- Блок размытия — это разделимый фильтр , поэтому только два 1D-прохода со средним размером 2 r + 1 для каждого пикселя потребуется пикселя, один по горизонтали и один по вертикали. Это снижает сложность с O( Nr 2 ) до O( Nr ) . В терминологии цифровой обработки сигналов каждый проход представляет собой фильтр скользящего среднего .
- Накопление. Вместо того, чтобы отбрасывать сумму для каждого пикселя, алгоритм повторно использует предыдущую сумму и обновляет ее, вычитая старый пиксель и добавляя новый пиксель в диапазон размытия. таблицу суммированных площадей Аналогичным образом можно использовать . Это снижает сложность с O( Nr ) до O( N ) .
- При использовании в нескольких проходах для аппроксимации размытия по Гауссу конструкция каскадного интеграторно-гребенчатого фильтра позволяет выполнить эквивалентную операцию за один проход. [7]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Войцех Ярош. 2001. Быстрые свертки изображений .
- ^ Спецификация W3C SVG1.1, 15.17 Примитив фильтра feGaussianBlur .
- ^ Jump up to: а б с д и Гетрёйер, Паскаль (17 декабря 2013 г.). «Обзор алгоритмов гауссовской свертки» . Обработка изображений в режиме онлайн . 3 : 286–310. дои : 10.5201/ipol.2013.87 . ( код документа )
- ^ «Стекблюр и квадратичный стекблюр» . observablehq.com . 12 ноября 2018 г.
- ^ «Как размыть изображение на Android» . Середина . 10 февраля 2020 г.
- ^ Куцвир, Иван. «Самое быстрое размытие по Гауссу (за линейное время)» . Проверено 4 апреля 2020 г.
- ^ Ситакер, Краген. «Хм, если не считать моей заметки о том, что семейство ядер, обнаруженное Костеллой, представляет собой в точности однородные кардинальные B-сплайны…» Hacker News .