2008-10-22 10 views
20

Wo finde ich Algorithmen für Bildverzerrungen? Es gibt so viele Informationen über Blur und andere klassische Algorithmen, aber so wenig komplexere. Insbesondere interessiere ich mich für den Bildverzerrungsalgorithmus mit Wirbeleffekt.Ressourcen für Bildverzerrungsalgorithmen

Antwort

27

Ich kann keine Referenzen finden, aber ich kann eine grundlegende Vorstellung davon geben, wie Verzerrungseffekte funktionieren.

Der Schlüssel zur Verzerrung ist eine Funktion, die im verzerrten Bild zwei Koordinaten (x, y) annimmt und sie im Originalbild in Koordinaten (u, v) umwandelt. Dies gibt die Umkehrfunktion der Verzerrung an, da sie das verzerrte Bild zurück zum Originalbild nimmt. Um das verzerrte Bild zu erzeugen, wird eine Schleife über x und y, berechnet den Punkt (u, v) aus (x, y) unter Verwendung der inversen Verzerrungsfunktion und setzt die Farbkomponenten bei (x, y) so, dass sie die gleichen sind wie diejenigen bei (u, v) im Originalbild. Man verwendet üblicherweise eine Interpolation (z. B. http://en.wikipedia.org/wiki/Bilinear_interpolation), um die Farbe bei (u, v) zu bestimmen, da (u, v) normalerweise nicht genau auf der Mitte eines Pixels liegt, sondern eher an einem Bruchpunkt zwischen Pixeln.

Ein Wirbel ist im Wesentlichen eine Rotation, wobei der Rotationswinkel vom Abstand vom Bildmittelpunkt abhängt. Ein Beispiel wäre:

a = amount of rotation 
b = size of effect 

angle = a*exp(-(x*x+y*y)/(b*b)) 
u = cos(angle)*x + sin(angle)*y 
v = -sin(angle)*x + cos(angle)*y 

Hier nehme ich der Einfachheit halber an, dass das Zentrum des Wirbels bei (0,0) ist. Der Wirbel kann beliebig gesetzt werden, indem die Koordinaten der Wirbelposition von x und y vor der Verzerrungsfunktion subtrahiert und nach und nach zu u und v addiert werden.

Es gibt verschiedene Wirbeleffekte: Einige (wie oben) verwirbeln nur eine lokalisierte Fläche und die Wirbelmenge nimmt zum Bildrand hin ab. Andere verstärken das Wirbeln zum Rand des Bildes hin. Diese Art von Sache kann getan werden, indem ungefähr mit der winkel = Linie gespielt wird, z.

angle = a*(x*x+y*y) 
0

Werfen Sie einen Blick auf ImageMagick. Es ist ein Tool zum Konvertieren und Bearbeiten von Bildern und verfügt über Schnittstellen für alle gängigen Sprachen.

Der -displace-Operator kann Wirbel mit der korrekten Verschiebungskarte erstellen.

Wenn Sie aus irgendeinem Grund nicht mit der ImageMagick-Schnittstelle zufrieden sind, können Sie immer den Quellcode der Filter betrachten und von dort aus gehen.

4

Der Wirbel und andere wie es sind eine Matrixtransformation an den Pixelpositionen. Sie erstellen ein neues Bild und erhalten die Farbe von einer Position auf dem Bild, die Sie erhalten, indem Sie die aktuelle Position mit einer Matrix multiplizieren.

Die Matrix ist abhängig von der aktuellen Position.

hier ist eine gute Codeproject zeigt, wie es

http://www.codeproject.com/KB/GDI-plus/displacementfilters.aspx

20

Es zu tun, ist eine Java-Implementierung von vielen Bild Filter/Effekte bei Jerry's Java Image Filters. Vielleicht können Sie sich von dort inspirieren lassen.

+2

Ich wünschte, ich könnte dies 10 mal upvote. Vielen Dank :) – fresskoma

+0

aber diese nehmen BufferedImage als Eingabe von Filets, die nicht in Android unterstützt wird – AAnkit

+1

ja gepufferte Bilder werden nicht in Android unterstützt .. dann haben Sie eine andere Idee für diese Wirkung. –