Как размыть растровое изображение (Android)? - PullRequest
5 голосов
/ 09 сентября 2010

Я изо всех сил стараюсь, чтобы растровые изображения были размыты с помощью Android.

Я видел много информации об использовании простого ядра типа

0    0    0    5    0    0    0
0    5   18   32   18    5    0
0   18   64  100   64   18    0
5   32  100  100  100   32    5
0   18   64  100   64   18    0
0    5   18   32   18    5    0
0    0    0    5    0    0    0

Моя проблема в том, что я действительно не уверен, как эффективно умножить это с моим растровым изображением.

Должен ли я пройти через каждый пиксель и

image.getPixel(x, y)

при сохранении этих значений в новом массиве (так что мне не нужно получать эти значения снова и снова), а затем пройти через массив и для каждого значения сложить окружающие значения, умноженные на соответствующее поле в ядре делится на 1068 (в случае вышеупомянутого ядра (= все записи суммируются))?

Есть ли лучший способ сделать это? Есть ли простое решение для границ?

Или в Android SDK есть что-то, что я пропустил?

Ответы [ 2 ]

4 голосов
/ 14 сентября 2010

То, что вы делаете, - это в основном двумерная свертка между исходным изображением 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.

1 голос
/ 09 сентября 2010

Попробуйте использовать BlurMaskFilter.

пример использования:

http://www.anddev.org/decorated_and_animated_seekbar_tutorial-t10937.html

...