zur Übersicht nächste Seite

imagemagick Teil14

Generell gilt bei den weißen Textstellen auf dieser Seite: Man fügt die Zeichenfolge aus dem weißen Feld bei dem blinkenden Cursor des Terminals ein - dann drückt man die Eingabetaste.

Es werden hier nur einige Informationen von der ImageMagick-Internetseite übersetzt. Für eine komplette Dokumentation bitte dort nachschauen.

Es wird das Bild deb6510.jpg (von Teil 3) verwendet

Man kann bei imagemagick über eine Maske enorm viel erreichen. Es werden hier zwei Bilder erzeugt die im Dateiformat .miff abgespeichert werden damit keine Bildinformationen verlorengehen. Zum Anzeigen werden diese im .gif Format vorgeführt. Zunächst deb7600.miff bzw. deb7600.gif
convert -size 100x100 gradient: -rotate 90 deb7600.miff

Dann deb7601.miff bzw. deb7601.gif
convert -size 100x100 xc:khaki -draw 'line 0,50 100,50' deb7601.miff

Man kann die Maske benutzen um Farben im Bild zu verändern, in vielen Möglichkeiten, z.B.
convert deb7601.miff deb7600.miff -compose Luminize -composite deb7612.jpg

Oder zum Verwischen (mit Angabe der Stärke)
convert deb7601.miff deb7600.miff -set option:compose:args 6 -compose Blur -composite deb7613.jpg

Auch zum Verschieben, was hier in senkrechter Richtung durchgeführt wird. Die miff-Bilder wurden in der Größe so gewählt daß sie in Höhe und Breite den Grauwerten 0.0 bis 1.0 entsprechen mit einer waagrechten Geraden in der Höhe von gray50. Eine senkrechte Verschiebung um 50 pixel wird dann entsprechend der Intensität der Maske druchgeführt was zu einem Bild führt das einem Koordinatensystem entspricht indem Funktionen gemalt werden.
convert deb7601.miff deb7600.miff -compose Displace -set option:compose:args 0x50 -composite deb7614.jpg

Dies zeigt die Gerade y=x
Anzeige einer Aufhellgeraden von Teil13
y=0.6x+0.4
convert deb7601.miff \( deb7600.miff -function Polynomial .6,.4 \) -compose Displace -set option:compose:args 0x50 -composite deb7615.jpg

Es wurde in Teil 13 schon bemerkt daß diese Funktionen in imagemagick-Befehlen enthalten sind, z.B. bei
-evaluate subtract
auch bei anderen -evaluate Varianten
auch bei -negate was der Geraden y=-x+1 entspricht
convert deb7601.miff \( deb7600.miff -negate \) -compose Displace -set option:compose:args 0x50 -composite deb7616.jpg

-function hat allerdings nur einen begrenzten Bereich von zur Verfügung gestellten mathematischen Funktionen:
Polynomial
Sinusoid
Arcsin
Arctan
Es fehlt schon eine einfache Wurzelfunktion. Dazu kann man auf
-gamma 2
zurückgreifen
convert deb7601.miff \( deb7600.miff -gamma 2 \) -compose Displace -set option:compose:args 0x50 -composite deb7617.jpg

Noch ein Beispiel mit einer Parabel
convert deb7601.miff \( deb7600.miff -function Polynomial 4,-4,1 \) -compose Displace -set option:compose:args 0x50 -composite deb7618.jpg

Diese Koordinaten-Bilder dienen der Veranschaulichung aber zeigen nicht wirklich was passiert. Die virtuellen pixel sind automatisch so eingestellt daß die Randpixel fortgesetzt werden. Also werden diese jetzt weiß gemacht. Außerdem wird mit
-set option:distort:viewport
ein vergrößertes Sichtfenster in den Bereich der virtuellen pixel geschaffen und das bisher sichtbare Fenster mit einem roten Rahmen markiert.
convert -virtual-pixel white deb7601.miff -set option:distort:viewport 200x200-50-50 -filter point -distort SRT '0' +repage \( deb7600.miff -set option:distort:viewport 200x200-50-50 -filter point -distort SRT '0' +repage -function Polynomial 4,-4,1 \) -compose Displace -set option:compose:args 0x50 -composite -stroke red -strokewidth 1 -fill none -draw 'rectangle 50,50 150,150' deb7622.jpg

Nun wird das Bild von Hund Rene mit transparenten virtuellen pixeln aufgeblasen und als Datei deb7610.png abgespeichert.
Damit lassen sich Funktionen gut anwenden.
Zunächst die Wurzelfunktion.
Dann die Parabelfunktion
Dann eine abgemilderte Verschiebung der Parabelfunktion
convert -virtual-pixel transparent deb6510.jpg -set option:distort:viewport 200x245-0-50 -filter point -distort SRT '0' +repage deb7610.png

convert -virtual-pixel transparent deb7610.png \( -size 245x200 gradient: -rotate 90 -gamma 2 \) -compose Displace -set option:compose:args 0x50 -composite deb7625.gif

convert -virtual-pixel transparent deb7610.png \( -size 245x200 gradient: -rotate 90 -function Polynomial 4,-4,1 \) -compose Displace -set option:compose:args 0x50 -composite deb7624.gif

convert -virtual-pixel transparent deb7610.png \( -size 245x200 gradient: -rotate 90 -function Polynomial 4,-4,1 \) -compose Displace -set option:compose:args 0x20 -composite deb7623.gif

        

Nun wird die Datei deb7610.png um 50% verkleinert, dupliziert und angeklebt. Bei dem folgenden animierten gif ist jeder frame anders und man kann keine Optimierung durchführen. Ohne die Verkleinerung würde die Dateigröße deutlich ansteigen.
convert -virtual-pixel horizontaltile -background none deb6510.jpg -resize 50% -set option:distort:viewport 200x122-0-25 -filter point -distort SRT '0' +repage deb7642.png

for i in {0..19} ; do let b=5*$i ; convert deb7642.png -crop 100x122+$b\+0 +repage \( -size 122x100 gradient: -rotate 90 -gamma 2 \) -compose Displace -set option:compose:args 0x25 -composite +depth miff:- ; done | convert -delay 8 - -reverse -loop 0 deb7644.gif

Man kann eine schmale Version der Parabelverschiebung durch das Bild laufen lassen.

Es wird wieder ein Bild von Hund Rene bereitgestellt das die folgenden Schritte anschaulich macht.
convert -virtual-pixel white deb6510.jpg -resize 50% -set option:distort:viewport 150x122-25-25 -filter point -distort SRT '0' +repage deb7676.jpg

Auch -level A%,B% erzeugt eine Gerade
convert deb7601.miff \( deb7600.miff -level 25%,75% \) -compose Displace -set option:compose:args 0x50 -composite deb7680.jpg

Es ist von Vorteil wenn bei -level die Werte gleichmäßig von 50% entfernt sind. Dann ist das Ergebnis mittig ausgerichtet.
Zunächst wie üblich eine senkrechte Verschiebung.
Man kann natürlich auch waagrecht verschieben, hier bei den Bildern in der Mitte, mit zwei verschiedenen Werten.
Und man kann in beiden Richtungen verschieben.
convert deb7676.jpg \( -size 122x150 gradient: -rotate 90 -level 25%,75% \) -compose Displace -set option:compose:args 0x25 -composite deb7681.jpg

convert deb7676.jpg \( -size 122x150 gradient: -rotate 90 -level 25%,75% \) -compose Displace -set option:compose:args 25x0 -composite deb7682.jpg

convert deb7676.jpg \( -size 122x150 gradient: -rotate 90 -level 25%,75% \) -compose Displace -set option:compose:args 55x0 -composite deb7682A.jpg

convert deb7676.jpg \( -size 122x150 gradient: -rotate 90 -level 25%,75% \) -compose Displace -set option:compose:args 25x25 -composite deb7683.jpg

            

Aber man kann die Verschiebung auch mit zwei Masken durchführen, wobei die erste Maske eine waagrechte Verschiebung und die zweite Maske eine senkrechte Verschiebung bewirkt. Damit lassen sich unterschiedliche Effekte kombinieren.
convert deb7676.jpg \( -size 122x150 gradient: -rotate 90 -level 25%,75% \) \( -size 122x150 gradient: -rotate 90 -function Polynomial 4,-4,1 \) -compose Displace -set option:compose:args 25x25 -composite deb7684.jpg

Dies sieht schon ähnlich wie ein Zylinder aus. Man braucht also eine waagrechte Schrumpfung, möglichst noch mit einem Einrolleffekt und eine senkrechte Verzerrung die kreisförmig erfolgt.
Die auf der imagemagick-Seite verwendeten Funktionen sind
für die waagrechte Schrumpfung
convert deb7601.miff \( deb7600.miff -function arcsin 0.5 \) -compose Displace -set option:compose:args 0x50 -composite deb7679.jpg

und für die senkrechte Verzerrung
convert deb7601.miff \( deb7600.miff -level 25%,75% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -compose Displace -set option:compose:args 0x50 -composite deb7678.jpg

Erste Anwendung
convert deb7610.png \( -size 245x200 gradient: -rotate 90 -function arcsin 0.5 \) \( -size 245x200 gradient: -rotate 90 -level 25%,75% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -virtual-pixel transparent -compose Displace -set option:compose:args 50x50 -composite -crop 200x195+0+50 +repage deb7691.gif

Es sei
B die Breite des Bildes (hier 200pixel)
D der Durchmesser des Zylinders (der hier 100pixel beträgt)
Die waagrechte Schrumpfung muß also 50pixel (von rechts und links) erfolgen. Das bedeuted
args 50xHöhe.
Die Höhe kann zwischen 0 und 50 variieren, sogar negative Werte annehmen. Bei Werten über 50 reicht der Bereich der transparenten Umgebungspixel nicht aus - diese müßten vergrößert werden.
Man hat hier also
D/B = 1/2 = 50%

In der Realität wird die Breite des Bildes auf den halben Umfang des Kreises projiziert, d.h.
D/B = 2/pi ≈ 0.6366 = 63,66%
Die Funktionen müssen also angepasst werden. Für die waagrechte Schrumpfung
convert deb7601.miff \( deb7600.miff -function arcsin 0.6366 \) -compose Displace -set option:compose:args 0x50 -composite deb7679K.jpg

und für die senkrechte Verzerrung
convert deb7601.miff \( deb7600.miff -level 18.17%,81.83% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -compose Displace -set option:compose:args 0x50 -composite deb7678K.jpg

Zweite Anwendung.
Die waagrechte Schrumpfung muß jetzt mit 36pixel (von rechts und links) erfolgen.
convert deb7610.png \( -size 245x200 gradient: -rotate 90 -function arcsin 0.6366 \) \( -size 245x200 gradient: -rotate 90 -level 18.17%,81.83% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -virtual-pixel transparent -compose Displace -set option:compose:args 36x50 -composite -crop 200x195+0+50 +repage deb7691K.gif

Daraus kann man ein animiertes gif machen.
for i in {0..19} ; do let b=10*$i ; convert deb7610.png deb7610.png +append -crop 200x245+$b\+0 +repage \( -size 245x200 gradient: -rotate 90 -function arcsin 0.6366 \) \( -size 245x200 gradient: -rotate 90 -level 18.17%,81.83% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -virtual-pixel transparent -compose Displace -set option:compose:args 36x50 -composite -crop 200x195+0+50 +repage +depth miff:- ; done | convert -delay 10 - -reverse -loop 0 deb7692.gif

Trotzdem ist der Zylinder noch verbesserungsfähig. Im Internet gab es dazu Diskussionen. Zugrundegelegt wird ein Testbild das im Dateiformat .miff abgespeichert wird damit keine Bildinformationen verlorengehen. Zum Anzeigen wird dieses im .gif Format vorgeführt: deb7694R.miff bzw. deb7694R.gif
convert -size 40x20 xc:#E39393 -set option:distort:viewport 320x160-0-0 -virtual-pixel CheckerTile -background black -filter point -distort SRT 0 -set option:distort:viewport 320x260-0-50 -virtual-pixel transparent -filter point -distort SRT 0 deb7694R.miff

Dieses Bild (320x160 pixel) wird auf den Zylinder gelegt nach der zweiten Anwendung. Da das Bild auf den halben Umfang des Zylinders gelegt wird hat der Zylinder den Durchmesser 204 pixel. Die waagrechte Schrumpfung muß jetzt 58 pixel (von rechts und links) betragen. Sollen andere Zylindermaße verwendet werden so muß das Bild zugeschnitten oder skaliert werden.
convert deb7694R.miff \( -size 260x320 gradient: -rotate 90 -function arcsin 0.6366 \) \( -size 260x320 gradient: -rotate 90 -level 18.17%,81.83% -function Polynomial -4,4,0 -gamma 2 -function Polynomial -.5,.5 \) -virtual-pixel transparent -compose Displace -set option:compose:args 58x50 -composite deb7694K.gif

Die mittleren Rechtecke haben sich fast in Quadrate verwandelt. Die Funktion zur Schrumpfung könnte anders gewählt werden. Es müßten um den x-Wert .5
also in der räumlichen Mitte
die Funktionswerte auch um .5 liegen, die Farbe gray50, die keine Verschiebung bewirkt. Dann blieben die Rechtecke auch Rechtecke. Man kann ein Polynom dritten Grades ausprobieren.
Es gibt drei Punkte durch die die Kurve läuft
y(0.1817)=0
y(.8183)=1
y(.5)=.5
Und es soll eine waagrechte Tangente in(.5,.5) geben
y'(.5)=0

Bei einem Polynom 3.Grades führt dies zu vier Gleichungen für 4 Unbekannte.
Zur Lösung kann man das script von der Seite
www.garn-bachmann/sites/zugdea51.htm
verwenden.

Man erhält das Polynom.
-function Polynomial 15.4564,-23.2,11.61,-1.4359
Rechts das Polynom dritten Grades, links die alte arcsin Funktion.
convert deb7601.miff \( deb7600.miff -function Polynomial 15.4564,-23.2,11.61,-1.4359 \) -compose Displace -set option:compose:args 0x50 -composite deb7693.jpg

    

Mit dem Polynom 3.Grades als Funktion zur Schrumpfung bleiben die Rechtecke im mittleren Bereich auch Rechtecke.

Dritte Anwendung
mit dem Polynom 3.Grades bei dem Bild mit Hund Rene im Vergleich zur
zweiten Anwendung
mit der arcsin Funktion. Besonders in der Bildmitte sieht man bei dem Ohr deutliche Unterschiede.


zur Übersicht nächste Seite

Datenschutzerklärung
Impressum