2010-09-09 13 views
5

Ich kämpfe um Bitmaps mit Android verschwommen zu bekommen.Wie verwischt man eine Bitmap (Android)?

Ich habe eine Menge von Informationen gesehen über einen einfachen Kern wie

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 

Mein Problem ist, dass ich bin wirklich nicht sicher, wie dies in einer effizienten Art und Weise mit meinem Bitmap multiplizieren.

Sollte ich durch jedes Pixel und

image.getPixel(x, y) 

während diese Werte in ein neues Array zu speichern (so habe ich nicht diese Werte immer und immer wieder zu bekommen) und dann das Array durchlaufen und für jeder Wert summiert die umgebenden Werte multipliziert mit dem entsprechenden Feld im Kern geteilt durch 1068 (im Fall des obigen Kernels (= alle Einträge summiert))?

Gibt es einen besseren Weg, dies zu tun? Gibt es eine einfache Lösung für die Grenzen?

Oder gibt es sogar etwas im Android SDK, das ich verpasst habe?

+0

Siehe meine Antwort für eine vollständige Kopie und Einfügen Quick Bitmap Unschärfe-Implementierung für Android: http://Stackoverflow.com/a/10028267/578746 – Yahel

Antwort

4

Was Sie tun, ist im Grunde 2D-Faltung zwischen Originalbild I und Kern K (Kernel ist eigentlich PSF - Point-Spread-Funktion). Wenn Ihr Bild I die Größe m x n hat und der Kernel die Größe r x s hat, benötigen Sie für jeden Punkt des unscharfen Bildes J r x s Multiplikationen, was insgesamt m x n x r x s Multiplikationen für das gesamte Bild ergibt.

Rechnerisch effizienterer Ansatz wäre die Verwendung von DFT (Discrete Fourier Transform). Machen Sie Transformationen des Bildes und des Kernels, multiplizieren Sie sie in der Transformationsdomäne, und kehren Sie dann über Inverse DFT zurück. Kurz zusammengefasst:

J = IDFT(DFT(I)*DFT(K)) 

Für die DFT-Berechnung existieren schnelle Algorithmen (FFT - Fast Fourier Transform). Sie können sie in C-Quelle im Internet finden. Um C Source zu verwenden, müssen Sie JNI (Java Native Interface) verwenden, das von der Android-Plattform unterstützt wird.

In Bezug auf Ränder haben Sie bei der Verwendung von DFT keine Probleme, da die Unschärfe am Rand kreisförmig erfolgt (z. B. werden die Werte für den linken Rand auch mit einigen Werten für den rechten Rand berechnet).

Wenn Sie mit den Kernen arbeiten, die getrennt werden können (2D-Kernel wird als äußeres Produkt von 1-D-Kernen dargestellt), wird es einfacher. 2D-Faltung kann als 1-D-Faltungen über Zeilen und dann über Spalten (oder umgekehrt) dargestellt werden. Das Gleiche gilt für das Weichzeichnen mit DFT.