Гауссовская фильтрация — ключевой этап обработки изображений, но требует значительных вычислительных ресурсов. Для ускорения применяются аппроксимации, разделяемые на фильтры с конечной (КИХ) и бесконечной (БИХ) импульсной характеристикой. КИХ-фильтры, такие как Stack blur, Bell blur и Running sums, аппроксимируют гауссиану разными способами.
Stack blur — метод скользящего окна с простыми весами, использующий только сложения и вычитания. Bell blur модифицирует Stack blur, применяя взвешенные суммы входящих и уходящих пикселей. Метод Running sums использует ступенчатую аппроксимацию гауссианы и интегральные изображения для ускорения вычислений.
Разные методы демонстрируют разную точность и сложность. Stack blur — самый быстрый на x86_64, а Running sums с тремя ступенями — на ARMv8, оба с хорошим визуальным качеством и с ошибками порядка 10^-6. В целом все рассмотренные аппроксимации на практике оказались достаточно близкими к оригинальной гауссовой фильтрации.
Применение SIMD расширений (SSE на x86_64 и NEON на ARMv8) значительно ускоряет вычисления всех методов. Выбор конкретной аппроксимации зависит от баланса между необходимой точностью, скоростью и ограничениями по памяти устройства. При этом стоит помнить, что многократная свертка с бегущим средним тоже достаточно быстро дает результат, близкий к Гауссиану.
Изображение носит иллюстративный характер
Stack blur — метод скользящего окна с простыми весами, использующий только сложения и вычитания. Bell blur модифицирует Stack blur, применяя взвешенные суммы входящих и уходящих пикселей. Метод Running sums использует ступенчатую аппроксимацию гауссианы и интегральные изображения для ускорения вычислений.
Разные методы демонстрируют разную точность и сложность. Stack blur — самый быстрый на x86_64, а Running sums с тремя ступенями — на ARMv8, оба с хорошим визуальным качеством и с ошибками порядка 10^-6. В целом все рассмотренные аппроксимации на практике оказались достаточно близкими к оригинальной гауссовой фильтрации.
Применение SIMD расширений (SSE на x86_64 и NEON на ARMv8) значительно ускоряет вычисления всех методов. Выбор конкретной аппроксимации зависит от баланса между необходимой точностью, скоростью и ограничениями по памяти устройства. При этом стоит помнить, что многократная свертка с бегущим средним тоже достаточно быстро дает результат, близкий к Гауссиану.