То, что вы делаете, - это в основном двумерная свертка между исходным изображением I и ядром K (ядро на самом деле является функцией рассеяния точки PSF).Если ваше изображение I имеет размер m x n
, а ядро имеет размер r x s
, для каждой точки размытого изображения J необходимо умножение rxs, в результате чего получается всего m x n x r x s
умножений для всего изображения.
В вычислительном отношении более эффективным подходом было бы использование ДПФ (дискретного преобразования Фурье).Сделайте преобразования изображения и ядра и умножьте их в области преобразования, а затем верните обратно через Inverse DFT.Вкратце:
J = IDFT(DFT(I)*DFT(K))
Для вычисления DFT существуют быстрые алгоритмы (FFT - быстрое преобразование Фурье).Вы можете найти их в источнике C в Интернете.Чтобы использовать источник C, вам нужно использовать JNI (собственный интерфейс Java), поддерживаемый платформой Android.
Что касается границ, то при использовании DFT у вас нет проблем, поскольку размытие границ выполняется по кругу (например, значения левой границы вычисляются с использованием также некоторых значений правой границы).
Если вы работаете с ядрами, которые могут быть разделены (двумерное ядро представлено как внешний продукт одномерных ядер), тогда это становится более простым,2D свертка может быть представлена в виде 1-D свертки по строкам, а затем по столбцам (или наоборот).То же самое верно для размытия с использованием DFT.