Bitmaps skalieren

Tronar

aus Überzeugung altmodisch
Hallo, Leuts!

Wie vergrößert und (vor allem) verkleinert Ihr denn Eure Fotos und sonstigen Pixelbilder. Ich habe dafür bisher einfache Bildbetrachter wie "xv" benutzt, aber eben ist mir aufgefallen, wie schlecht das aussieht. "xv" wählt vermutlich bei Verkleinerung einfach den nächstgelegenen Pixel.
Leider ist den wenigsten Programmen aus der Dokumentation zu entnehmen, ob sie raffiniertere Algorithmen besitzen. Irgendwo habe ich mal ein Skript für MPlayer gesehen, das sich genau dieses Problems annahm und mit der ganz großen Kanone eines Videoplayers auf den Spatz Einzelbild-Bearbeitung schoß, weil anscheinend die eigentlichen Bildbearbeitungsprogramme dafür zu schlecht sind.

Es existieren auch noch spezielle Algorithmen für ganzzahlige Skalierungsfaktoren, wenn etwa 2×2 Pixel in einen zusammengefaßt werden sollen. Das würde mir genügen; es geht ja meist nur darum, die Datenmenge ordentlich zu reduzieren.

Also, was gibt es da alles, speziell unter FreeBSD? Wer hat einen Überblick? Wo könnte ich einen Überblick bekommen?
 
Ich nehme für so etwas immer mogrify bzw. convert. Beides Bestandteil von graphics/Imagemagick.

HTH
 
gthumb (Bildbestrachter) kann auch skalieren, allerdings kann ich nichts über die Qualität sagen. Im Zweifel nutze ich gimp.
 
Nach meiner Erfahrung liefert Gimp mit kubischer oder sinc Interpolation immer gute Bilder. Kommt drauf an was man will.
 
Ich nehme für so etwas immer mogrify bzw. convert. Beides Bestandteil von graphics/Imagemagick.
Klar, es gibt viele; da wären auch noch gimp und die Grafik-Anhängsel der bekannten Office-Pakete - und Bildbetrachter wie Sand am Meer!
Aber auch bei "mogrify" müßte ich den Quellcode lesen können, um zu sehen, was er macht. Es sieht besser aus als bei "xv", aber dokumentiert ist es nicht. Meine Frage zielte auf die bestmögliche Lösung für so was, aber da hilft wohl nur viel, viel probieren.
 
kommt darauf an, was man will....
wenn es drauf ankommt, nehme ich gimp.
wenn es schnell gehen soll bei "ausreichender" Quallität mache ich das mit gwenview und den integrierten kipi-plugins. Da kann ich einen ganzen Schwung von Bildern mittels Stapelverarbeitung skalieren (oder auch anders verändern) und dabei einige Optionen wählen, die direkt auf die Quallität einwirken. Für mich hat das bislang immer genügt.
 
Es kommt ziemlich auf die Ausgangsbilder an, welche Algos man wählt.

Wenn du zum Beispiel ein stark rauschendes Bild hast bietet sich eine einfache kubische Skalierung mit nachträglichem unscharf maskieren an.

Wenn die Ausgangsbasis qualitativ hochwertig ist kommt bei mir Sync Lanczos zum Einsatz und zwar in mehreren ungeraden Schritten. Der Algo mag weder Ganzzahlen, noch unscharf maskieren.

Ganzzahlige Schritte, wie von dir beschrieben sollte man wenn möglich vermeiden. Es gibt da einige Ausnahmen, wie vorhergehendes doppelt vergössern, weichzeichnen und dann runterskalieren, aber ich denke sowas machst du gerade nicht.

Skalieren hat nicht nur den Grund der Datenminimierung. Skalieren aufs Ausgabemedium ist ein wichtiger Schritt in der Bildverarbeitung. Du glaubst garnicht, wie scheusslich ein unskaliertes 400MPix Bild aussieht, wenn du es auf nem Bildschirm anzeigen lässt. Es muss erst sinnig skaliert werden, um zu wirken.
 
Wenn du zum Beispiel ein stark rauschendes Bild hast bietet sich eine einfache kubische Skalierung mit nachträglichem unscharf maskieren an.
"Kubisch" ist wohl der Grad eines Interpolationspolynoms!?

Wenn die Ausgangsbasis qualitativ hochwertig ist kommt bei mir Sync Lanczos zum Einsatz und zwar in mehreren ungeraden Schritten. Der Algo mag weder Ganzzahlen, noch unscharf maskieren.
Das ist wohl ein Programm aus der Windows-Welt?

Ganzzahlige Schritte, wie von dir beschrieben sollte man wenn möglich vermeiden.
Ich dachte eigentlich, die richten am wenigsten Schaden an. Und dafür müßte es die einfachsten (und besten) Algorithmen geben. Bei einer Skalierung um den Faktor 1,1 liegen die interpolierten Pixel mal auf den Ursprungspixeln, mal genau dazwischen, also das verschiebt sich ständig. Bei Ganzzahlfaktoren liegen sie immer in der Mitte. Aber vielleicht denke ich da zu simpel.

Du glaubst garnicht, wie scheusslich ein unskaliertes 400MPix Bild aussieht, wenn du es auf nem Bildschirm anzeigen lässt. Es muss erst sinnig skaliert werden, um zu wirken.
Du kannst ein 400-MPix-Bild doch gar nicht anzeigen lassen. Du kannst es nur dem X-Server übergeben, der es dann automatisch auf das Ausgaberaster skaliert. Ich weiß nicht, das das X-Protokoll da genau anbietet, aber das läuft sicher mit einem sehr primitiven Algorithmus. Möglicherweise macht mein "xv" das genau so.


Deine Hinweise waren jedenfalls interessant. Ich werde da doch ein bißchen was lesen müssen.
Schönes Wochenende
Tronar
 
...Du kannst ein 400-MPix-Bild doch gar nicht anzeigen lassen. Du kannst es nur dem X-Server übergeben, der es dann automatisch auf das Ausgaberaster skaliert. Ich weiß nicht, das das X-Protokoll da genau anbietet, aber das läuft sicher mit einem sehr primitiven Algorithmus. Möglicherweise macht mein "xv" das genau so.
...Tronar


Das ist für mich der Hauptgrund, weshalb ich überhaupt skalieren will.
Bilder im Vollformat stellen sich gut und schnell dar, wenn sie genau Bildschirmauflösung haben. Bilder mit riesengroßen Datenmengen, die dann nicht auf den Monitor passen, sind unhandlich. Allerdings stimmt dies ja nicht, wenn diese Bilder dann auf hochwertiger HW ausgedruckt werden sollen (die ich allerdings nicht habe). Bilder, mit hoher Auflösung sind interessant, wo es etwas zu vergrößern gibt oder nur Ausschnitte zur Wiedergabe kommen (was natürlich auch eine Darstellungsoption ist).

Bei mir werden weniger bmp als jpg Bilder gewandelt.
Wenn man das genau nimmt, ist das ja ein vollkommen unterschiedliches Problem, zu dem hier nachgefragten.
Das mit der Wandlung der Größe ist recht komplex und es hat zunächst gar nichts mit der Darstellung auf einem Monitor zu tun. Klar, da wird es angezeigt und der hat eine eigene Auflösung und deshalb kann eine Anzeige auf einem Monitor vielleicht besser sein, als auf einem anderen, doch so etwas kann nicht vorhergesagt werden. Die Pixelung auf dem Ausgangsbild ist vollkommen unabhängig von der Darstellung auf dem Monitor.
Wenn angenommen wird, dass deine Bildpixel gleich groß sind, dann gibt es doch immer noch sehr sehr viele Möglichkeiten, wie die Anzahl nun veringert werden soll. Angenommen, du möchtest von vier Pixel auf eines kommen. Dann kannst du jeweils vier Pixel zusammenfassen und einen Mittelwert bilden und daraus einen neuen Wert bekommen. Du kannst aber auch vier mal vier Pixel nehmen und daraus einen Mittelwert bilden und dann diesen mit den jeweilg nächsten Werten abgleichen, um so sanfte Übergänge zu erreichen. Du kannst solch eine Pixelmaske bilden und mehrfach über das Bild laufen lassen. Also, bei mir ist das schon so lange her, dass ich beinahe alles dazu wieder vergessen habe. Woran ich mich noch erinnere ist aber, dass es verdammt viele Möglichkeiten gibt und diese nicht einfach für einen Laien beherrschbar sind.

Ich kann mich nicht erinnern, wo es einen Algorythmus gab, der irgendwie zwischen Pixeln landet. Es handelt sich immer in irgendeiner Form um Angaben, wieviele Pixel zur Ermittlung des neuen Pixels herangenommen werden und wie die gewichtet werden sollen. Da werden doch nicht einfach Pixel wegfallen gelassen, also übersprungen.

Jedenfalls hat mich nicht zuletzt deshalb auch gwenview praktisch überzeugt, weil das was dort angeboten wird einfache und taugliche Möglichkeiten bietet, die für einen Laien sehr brauchbare Ergebnisse schaffen und flott in der Anwendung sind.
 
Bilder im Vollformat stellen sich gut und schnell dar, wenn sie genau Bildschirmauflösung haben. Bilder mit riesengroßen Datenmengen, die dann nicht auf den Monitor passen, sind unhandlich.
Deshalb gefällt mir "xv": Das macht 1:1 als Standardeinstellung, solange das Bild noch auf den Bildschirm paßt.

Bei mir werden weniger bmp als jpg Bilder gewandelt.
Mit "Bitmap" meinte ich natürlich den Sammelbegriff, nicht das Microsoftsche Dateiformat.

Angenommen, du möchtest von vier Pixel auf eines kommen. Dann kannst du jeweils vier Pixel zusammenfassen und einen Mittelwert bilden und daraus einen neuen Wert bekommen. Du kannst aber auch vier mal vier Pixel nehmen und daraus einen Mittelwert bilden und dann diesen mit den jeweilg nächsten Werten abgleichen, um so sanfte Übergänge zu erreichen. Du kannst solch eine Pixelmaske bilden und mehrfach über das Bild laufen lassen.
4×4 Pixel paßt z. B. auf ein kubisches Polynom in x und y. Das hat genau 16 Koeffizienten. Aber derlei scheint immer noch zu den "dummen" Algorithmen zu gehören, wenn man die Leute hier so reden hört ...
(Im Gegensatz zu Dir habe ich diese Dinge nicht vergessen, weil ich sie nie gelernt habe. :) )

Ich kann mich nicht erinnern, wo es einen Algorythmus gab, der irgendwie zwischen Pixeln landet. Es handelt sich immer in irgendeiner Form um Angaben, wieviele Pixel zur Ermittlung des neuen Pixels herangenommen werden und wie die gewichtet werden sollen.
Das verstehe ich nicht. Es landet doch _jeder_ Algorithmus zwischen Pixeln, außer bei ganzzahligen Verkleinerungsfaktoren.

Da werden doch nicht einfach Pixel wegfallen gelassen, also übersprungen.
Doch, zumindest "xv" macht genau das.

Danke jedenfalls an Dich und die anderen. Mit den Hinweisen auf Gimp und Gwenview bin ich schon mal gut bedient. Dort ist offenbar viel mehr Grips hineingeflossen.

Schönen Sonntag noch
Tronar
 
Tronar schrieb:
Das verstehe ich nicht. Es landet doch _jeder_ Algorithmus zwischen Pixeln, außer bei ganzzahligen Verkleinerungsfaktoren.
Das Problem ist, dass man eben nicht irgendwelche wahllosen Pixen weglassen oder zusammenfassen kann. Das klappt zwar aus algorithmischer Sicht wunderbar, allerdings ist das menschliche Auge zu intelligent. Das Gehirn gibt das Gesehene nicht einfach wieder, es interpretiert es außerdem. Und wenn man wahllos Pixel weglässt, geht es schief. Der Bildeindruck stimmt dann nicht mehr... Ein ganz klassisches Beispiel sind Moire, die man beim starken skalieren vieler kleiner, parallel laufender Objekte sieht. Das Gehirn interpretiert eine Struktur in ein Muster herein, die gar nicht interpretiert.
Wenn man nun ein sehr großes Bild an X11 übergibt und ihm sagt "male das mal", macht es genau das. Es lässt wahllos Pixel weg (sprich wendet einen dummen Skalierer an) um es darzustellen. Dabei geht der ganze Bildeindruck den Bach runter, es sieht einfach bescheiden aus. Das Gleiche beim Drucken. Das tolle 400mpixel-Bild auf normale Größe gedruckt zwingt den Druckertreiber Pixel herauszurechnen. Das macht er nicht gut, das Ergebnis ist murks.
Ein guter Skalieralgo arbeitet so, dass er die menschliche Wahrnehmung beachtet und die zu verwerfenden bzw. neu zu generierenden Pixel entsprechend auswählt. Zum Beispiel sollte an Kontrastkanten kein simples 4x4 Muster rübergejagt werden, da die Kante scharf und stabil bleiben muss. Auf der anderen Seite soll sie aber auch nicht überschärft werden... Gutes Skalieren ist eine Kunst, die viel Erfahrung braucht. Jedes Bild, jedes Motiv wird von einem Algorithmus anders verarbeitet, entsprechend muss man den Algo anhand des Bildes auswählen. Welche Parameter man ihn übergeben muss, etc. ist noch eine ganz andere Alchemie.

Beispiele:
- Troll sagte, dass man bei stark rauschenden Bildern kubisch interpolieren sollte. Kubische Skalierung - meist Bikubisch oder Trikubisch - sind einfach Verfahren, die aus vorhandenen Werten (hier Pixel) neue interpolieren. Dabei sind sie "dumm" und betrachten jedes Pixel losgelöst vom Kontext. Sie hängen sich also nicht an oftmals ungewünschten Artefakten durch Rauschen nicht auf. Die Wikipedia-Artikel, die aber schwerer Stoff sind, dazu:
1. http://en.wikipedia.org/wiki/Bicubic_interpolation
2. http://en.wikipedia.org/wiki/Tricubic_interpolation

- Sinc und Lanczos in all ihren Abarten beachten die Umgebung eines Wertes - hier also wieder eines Pixel - und beschreibt sie mit Hilfe einer mathematischen Funktion. Hat man eine Funktion, die das menschliche Sehverhalten gut abbildet, erreicht man dadurch mit vergleichweise wenig Rechenaufwand ein gutes Ergebnis. Allerdings nur unter der Annahme, dass im Bild nichts den Algo verwirrt. Oben genanntes Rauschen - gerade Farbrauschen - lässt ihn Fehlannahmen treffen und das Ergebnis ist dann ein übles, hässliches und um ein Vielfaches verstärktes Rauschen.

Als Fazit kann man sagen, wenn man sich nicht zu sehr damit beschäftigen möchte, sollte man sich auf Sinc-Lanczos beschränken und am Ende der Verarbeitung die Bilder einmal sichten. Welche, die murksig aussehen, muss man dann von Hand noch einmal mit einem anderen Algo manuell nacharbeiten. Das klappt dann meist.
 
Ich widerspreche Yamagi mit Sync Lanczos als Standardalgo zum Skalieren.
Der Algo erkennt Kontrastkanten, weshalb ein bereits nachgeschärftes Bild schnell überschärft wirkt.
Die meisten Digitalkameras schärfen bereits bei der internen Umwandlung zum jpeg. Die Grundeinstellungen sind meist so, dass das Bild einfach auf den Schirm geklatscht werden soll, weil sich die wenigsten Leute noch die Mühe einer Skalierung machen.
Das Resultat sind sehr schnell überschärfte Bilder. Da der Schärfeeindruck durch einen erhöhten Kantenkontrast erreicht wird fehlen Farbinformationen, weshalb dann gerade Bilder mit vielen Details, wie zum Beispiel ein Baum mit vollem Blattwerk plötzlich farblich flau aussehen.
Wenn man diesen Algo als Grundeinstellung nimmt, sollte man seine Kamera dafür anpassen, in dem man ein paar Testaufnahmen mit unterschiedlichen Schärfeeinstellungen macht.
Noch ne kleine Ergänzung zur Farbe: Skalierung kann den Farbeindruck auch von Flächen verändern. Es hängt davon ab, wie die Flächen strukturiert sind. Das runterrechnen muss hier Pixel zusammenfassen, oder weglassen, aber erst die Summe der Pixel ergeben den Farbeindruck. Rauschen, oder Filmkorn kann also beim Skalieren den Farbeindruck stark verändern.

Edit: Noch was zur Endgrösse. Pit schrieb schon ganz richtig, dass ein Bild am besten dargestellt wird, wenn es genau Ausgabegrösse hat. Dennoch empfehle ich min 1.5fache Kantenlänge zu nehmen(ich nehm 2fach), weil die Dinger sonst eventuell in 10 Jahren mit den neuen Bildschirmen mit erheblich brutalerer Auflösung als heute nur noch einen kleinen Teil des Bildschirms ausfüllen und eine Vollansicht nicht mehr möglich ist. Auf 6 bis 7MP skalieren hat auch was. Es reicht in den meisten Fällen für nen Druck und bei richtigem Betrachtungsabstand zum Schirm kann da kommen was wolle.
 
Zuletzt bearbeitet:
Ich verlasse mich beim Skalieren auf den Betrachter (feh) und belasse die Bilder in Originalgröße.
 
Zurück
Oben