Bild-downsampling-algorithmen
Was ist der beste re-sampling-Algorithmus, den ich verwenden können, unterteilen Sie ein Bild in die Hälfte seiner ursprünglichen Größe. Die Geschwindigkeit ist von größter Bedeutung, aber es sollte nicht verschlechtern die Qualität zu schlecht. Ich bin im Grunde versucht, ein Bild zu erzeugen Pyramide.
War ich ursprünglich geplant zu überspringen Pixel. Ist dies der beste Weg zu gehen? Von dem, was ich gelesen habe, das erzeugte Bild durch pixel-skipping ist zu scharf. Könnte jemand, der versucht hat, diesen Kommentar. Meine Bilder enthalten anzeigen von Daten in der Art, wie diese.
InformationsquelleAutor der Frage sleeping.ninja | 2011-05-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überspringen von Pixel führt zu aliasing, wo hohe Frequenz-änderungen (wie abwechselnd hell/dunkle Streifen) zu konvertieren niedrigen Frequenzen (wie z.B. konstantes Licht oder Dunkelheit).
Der Schnellste Weg zum verkleinern auf die Hälfte ohne aliasing ist die Durchschnittliche 2x2 Pixel zu einem pixel zusammengefasst. Bessere Ergebnisse lassen sich mit raffinierter Reduktion Kernel, aber Sie wird kommen, auf Kosten der Geschwindigkeit.
Edit: Hier sind einige Beispiele für die Techniken, die bisher besprochen haben.
Skipping jedes andere pixel - Sie können sehen, dass die Ergebnisse nicht sehr gut, indem man die Legende auf der linken Seite. Es ist fast unleserlich:
Durchschnittlich alle 2x2-raster - jetzt ist Der text scharf und gut lesbar:
Gaußscher Weichzeichner", wie vorgeschlagen, durch R. - ein wenig unschärfer, aber besser lesbar bis zu einem gewissen Punkt. Die Weichzeichnung kann eingestellt werden, um unterschiedliche Ergebnisse:
R. ist auch korrekt über die Gamma-Kurve, die die Ergebnisse beeinflusst, aber dies sollte nur sichtbar sein, auch bei den anspruchsvollsten Anwendungen. Meine Beispiele wurden durchgeführt, ohne gamma-Korrektur.
InformationsquelleAutor der Antwort Mark Ransom
Für Herunterskalierung Bereich-Mittelung (siehe Mark ' s Antwort) ist in der Nähe der besten, die Sie erhalten.
Den wichtigsten anderen Anwärter ist gaussian, mit einem etwas größeren radius. Dies erhöht die Unschärfe ein wenig, die könnte gesehen werden als ein Nachteil, aber würde die Unschärfe gleichmäßiger eher als abhängig von der Ausrichtung der Pixel mod 2.
In Fall ist es nicht sofort klar, was ich meine, betrachten Sie die pixel-Muster 0,0,2,2,0,0 und 0,0,0,2,2,0. Mit dem Bereich-Durchschnitt, würde Sie verkleinern, um 0,2,0 und 0,1,1, beziehungsweise - das ist, man wird scharf und hell, während die andere wird unscharf und trübe. Mit einem längeren filter, beide verschmiert, aber Sie erscheint mehr ähnlich, was vermutlich Fragen zur menschlichen Beobachtern.
Weiteres Problem zu berücksichtigen ist gamma. Es sei denn, gamma-linear ist, zwei Pixel der Intensität
k
viel weniger Gesamt-Intensität als ein einziges pixel mit der Intensität2*k
. Wenn Ihr filter führt ausreichend zu verwischen, ist es vielleicht nicht so eine große Rolle, aber mit den reinen Bereich-Mittelwert-filter es kann ein wichtiges Thema sein. Der einzige work-around, ich weiß gelten und Umgekehrt die gamma-Kurve vor und nach der Skalierung...InformationsquelleAutor der Antwort R..
Wenn Geschwindigkeit ein Problem ist, wie bereits erwähnt, empfehle ich, nehmen Sie einen 2x2-Block und den Durchschnitt berechnen, wie die daraus resultierenden pixel. Die Qualität ist nicht die beste, das erreicht werden kann, aber in der Nähe. Sie provozieren kann dieses Algorithmus zu zeigen, seine Schwächen, aber auf den meisten Bilder, die Sie nicht sehen, ein Unterschied, der rechtfertigen würde, die um ein Vielfaches höhere Rechenzeit.
Sie haben auch nicht haben, die keine Speicher-overhead.
Wenn Farbe Auflösung erniedrigt werden kann, um 6bit pro Kanal, hier ist eine ziemlich schnelle Art und Weise, die verhindert, dass Sie aus der ZERLEGUNG der ARGB Kanäle (hier unter der Annahme 32bit ARGB):
Nebeneffekt dieser alogrithm ist, dass wenn man als PNG gespeichert, die Dateigröße wird kleiner.
Dies ist, wie es aussieht:
InformationsquelleAutor der Antwort Thilo Köhler
Habe ich versucht zu verallgemeinern, Thilo Köhler die Lösung (aber in Python):
Dies funktioniert gut für die Skalierung von 2 (Viertel Größe), aber nicht für die Skalierung von 3 oder 4 oder anderen int-Werten. Ist es möglich, zu verallgemeinern?
BTW für nicht-Pythonistas der for-Schleife oben entspricht dies (außer, dass die erste version ist skalierbar, durch die änderung der SCHRITTLÄNGE):
Ich bin mit 32-bit-ARGB-Werte.
InformationsquelleAutor der Antwort Mark Summerfield
Den NetPBM-suite enthält ein Dienstprogramm namens pamscaledie bietet ein paar Optionen für die Neuberechnung. Es ist open source, so können Sie versuchen, die verschiedenen Optionen und dann kopieren Sie den Algorithmus, den Sie am besten gefällt (oder einfach libnetpbm).
InformationsquelleAutor der Antwort Nemo
http://www.cs.ubc.ca/nest/imager/tr/2011/BlurAwareDownsize/ap-resizing-validation/index.html
http://www.cs.ubc.ca/nest/imager/tr/2011/BlurAwareDownsize/
Wahrnehmungs-Bild-Downsampling
InformationsquelleAutor der Antwort Seth Robertson