Самая быстрая реализация размытия по Гауссу - PullRequest
32 голосов
/ 19 сентября 2008

Как реализовать алгоритм максимально быстрого размытия по Гауссу ?

Я собираюсь реализовать его на Java, поэтому решения GPU исключены. Мое приложение, planetGenesis , является кроссплатформенным, поэтому я не хочу JNI .

Ответы [ 16 ]

2 голосов
/ 19 сентября 2008

Я бы подумал об использовании CUDA или какого-либо другого инструментария для программирования на GPU, особенно если вы хотите использовать ядро ​​большего размера. Если это не удастся, то при сборке всегда можно настроить петли.

0 голосов
/ 02 июля 2018

Дейв Хейл из CWP имеет пакет minejtk, который включает в себя рекурсивный фильтр Гаусса (метод Дериче и метод Ван Влита). Подпрограмма Java может быть найдена в https://github.com/dhale/jtk/blob/0350c23f91256181d415ea7369dbd62855ac4460/core/src/main/java/edu/mines/jtk/dsp/RecursiveGaussianFilter.java

Метод Дериша кажется очень хорошим для размытия по Гауссу (а также для производных Гаусса).

0 голосов
/ 19 февраля 2018

Я видел несколько ответов в разных местах и ​​собираю их здесь, чтобы я мог попытаться обернуть их вокруг и запомнить их на потом:

Независимо от того, какой подход вы используете, фильтрует горизонтальные и вертикальные размеры отдельно с 1D-фильтрами, а не с помощью одного квадратного фильтра.

  • Стандартный «медленный» подход: сверточный фильтр
  • Иерархическая пирамида изображений с уменьшенным разрешением, как в SIFT
  • Повторяющиеся размытые прямоугольники, мотивированные центральной предельной теоремой. «Размытие в квадрате» занимает центральное место в распознавании лиц Виолы и Джонса, где они называют это целостным изображением, если я правильно помню. Я думаю, что в хаар-подобных функциях тоже есть что-то похожее.
  • Размытие стека : альтернатива, основанная на очереди, где-то между подходами сверточного и квадратного размытия
  • БИХ-фильтры

После рассмотрения всего этого мне напомнили, что простые, плохие приближения часто хорошо работают на практике. В другой области Алекс Крижевский обнаружил, что ReLU быстрее, чем классическая сигмовидная функция в его революционном AlexNet, хотя на первый взгляд они кажутся ужасным приближением к сигмоиде.

0 голосов
/ 23 июня 2016

Отвечая на этот старый вопрос с помощью новых библиотек , которые были реализованы в настоящее время (по состоянию на 2016 г.), потому что в технологии GPU с Java есть много новых улучшений

Как предлагается в нескольких других ответах, CUDA является альтернативой. Но Java имеет поддержку CUDA сейчас.

Библиотека IBM CUDA4J: предоставляет Java API для управления и доступа к графическим процессорам, библиотекам, ядрам и памяти. Используя эти новые API, можно писать Java-программы, которые управляют характеристиками устройства GPU и переносят работу на GPU с удобством модели памяти Java, исключений и автоматического управления ресурсами.

Jcuda: привязки Java для NVIDIA CUDA и связанных библиотек. С JCuda можно взаимодействовать со средой выполнения CUDA и API драйвера из программ Java.

Aparapi: позволяет разработчикам Java использовать преимущества вычислительной мощности устройств GPU и APU, выполняя фрагменты параллельного кода данных на GPU, а не ограничиваясь локальным процессором.

Некоторые Java OpenCL привязка библиотеки

https://github.com/ochafik/JavaCL: Java-привязки для OpenCL: объектно-ориентированная библиотека OpenCL, основанная на автоматически генерируемых низкоуровневых привязках

http://jogamp.org/jocl/www/: Java-привязки для OpenCL: объектно-ориентированная библиотека OpenCL, основанная на автоматически генерируемых низкоуровневых привязках

http://www.lwjgl.org/: Java-привязки для OpenCL: автоматически генерируемые низкоуровневые привязки и объектно-ориентированные классы удобства

http://jocl.org/: привязки Java для OpenCL: низкоуровневые привязки, которые являются отображением 1: 1 исходного OpenCL API

Все перечисленные выше библиотеки помогут реализовать Gaussian Blur быстрее, чем любая реализация в Java на CPU.

0 голосов
/ 24 мая 2014

Попробуйте использовать Box Blur, как я сделал здесь: Аппроксимация размытия по Гауссу с использованием размытой рамки

Это лучшее приближение.

Используя встроенные изображения, вы можете сделать это еще быстрее.
Если да, поделитесь своим решением.

0 голосов
/ 10 марта 2014

Существует несколько быстрых методов размытия по Гауссу для двумерных данных. О чем вы должны знать.

  1. Это сепарационный фильтр, поэтому требуется только два 1d свертки.
  2. Для больших ядер вы можете обработать уменьшенную копию изображения и затем увеличить ее обратно.
  3. Хорошая аппроксимация может быть получена с помощью нескольких блочных фильтров (также разделяемых), (можно настроить количество итераций и размеры ядра)
  4. Существуют алгоритмы сложности O (n) (для любого размера ядра) для точного приближения Гаусса с помощью БИХ-фильтра.

Ваш выбор зависит от требуемой скорости, точности и сложности реализации.

...