Interpolationsmethoden bei der Bildskalierung
-
Hallo liebe Community,
heute habe ich einen kleinen Algorithmus zur Bildskalierung geschrieben. Mein Verfahren ist folgendes:
Im folgenden Beispielbild möchte ich ein 5*5 Pixel grosses Bild auf 3*3 skalieren.
Einen Beispielpixel habe ich markiert.
http://24htpichost001.24.funpic.de/interpolation/meine_interpolation.png
Im linken Bild sieht man, welchen Pixeln im Quellbild mein Pixel im Zielbild entspricht.
Um den Wert des Zielpixels zu berechnen, lasse ich alle im Quellbild überdeckten Pixel einfliessen und gewichte sie je nach überdecktem Flächenanteil.
Hört sich rechenaufwendig an, jedoch bin ich mit einem 2Megapixel-RGB-Bild damit in 150ms auf meinem Rechner (kein Supercluster ;)) durch.Wenn ich meine Ergebnisse jedoch mit denen von Gimp und Photoshop vergleiche, finde ich meins jetzt zwar nicht unbedingt schlechter, es sieht jedoch anders aus.
Seltsam finde ich auch, dass das Gimp-bilinear nicht gleich dem Photoshop-bilinear ist. Beim bikubischen Interpolieren ist es das gleiche.Hier ein Beispielbild:
Original (128*128):
http://24htpichost001.24.funpic.de/interpolation/Testbild_128_original.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_128_original_zoom512.pngSkaliert (48*48):
Gimp-bilinear:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_gimp_linear.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_gimp_linear_zoom480.pngGimp-bikubisch:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_gimp_bikubisch.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_gimp_bikubisch_zoom480.pngPhotoshop-bilinear:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_photoshop_bilinear.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_photoshop_bilinear_zoom480.pngPhotoshop-bikubisch:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_photoshop_bikubisch.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_photoshop_bikubisch_zoom480.pngmeine Variante:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_imgconv_neu.png
Zoom:
http://24htpichost001.24.funpic.de/interpolation/Testbild_048_imgconv_neu_zoom480.pngIn klein siehts natürlich alles gleich aus, aber in den vergrößerten (hier natürlich ohne Interpolation) Versionen sieht man schon Unterschiede.
Hat jemand von euch Ahnung, was die anders machen (aus dem Gimp-Quelltext (scale-region) bin ich leider nicht schlau geworden.) und wieso Gimp und Photoshop nicht das gleiche tun, wo man doch eigentlich meinen sollte, dass "bilinear" und "bikubisch" mathematisch eindeutig definiert sein sollten?
Wär cool, wenn ihr mir weiterhelfen könntet.
Vielen Dank im Voraus.
Dobias
-
Ich hab keine Ahnung.
Aber was ich schon immer mal wissen wollte. Wenn es "bilinear" und "bikubisch" gibt, warum habe ich noch nie was von "biquadratisch" gehört?
Ok und jetzt noch die "Vermutung" von jemandem der überhaupt keine Ahnung von der Materie hat. Vieleicht benutzen Gimp und Photoshop verschiedene Basen. Oder sehen den Mittelpunkt der Pixel an verschiedenen stellen.
-
Die bikubisch-biquadratisch-Frage hab ich mir auch schon gestellt. Wir sind ja schliesslich in nem zweidimensionalen Raum ...
Wie die beiden anderen Programme die Mittelpunkte anders legen sollten, ist mir schleierhaft. Was meinst du mit Basen? Dass die nicht von quadratischen(bzw. rechteckigen) Pixeln sondern z.B. von andersgeformten ausgehen und dementsprechend auch andere Überlappungswerte bekommen?
-
Seit ihr noch nie auf die Idee gekommen einfach mal nach biquadratischer Interpolation zu googlen? Wie das verfahren bezeichnet wird hängt einfach von der verwendeten Interpolationsfunktion ab bzw. davon ob diese linear, quadratisch oder kubisch oder sonstwas ist.
-
Ah ok, Wikipedia hat mal wieder weitergeholfen. Jetzt versteh ich auch die bikubische Interpolation. Hier gehts nicht um die Dimensionen wie beim linearen sondern um die Funktion an sich.
Ich interpoliere hier bei mir ja aber nur linear (also bilinear, weils ja ein Bild ist).
Nur warum meine, die gimpsche und die photoshopsche lineare Interpolation jeweils unterschiedliche Ergebnisse liefern, versteh ich noch nicht. Das was ich mache, entspricht ja eigentlich der definition von bilinear.edit: Die Unterschiede könnten vielleicht was damit zu tun haben, wie das Bild im Speicher gehalten wird. (3 bytes, 3 doubles, usw.)
-
Um den Wert des Zielpixels zu berechnen, lasse ich alle im Quellbild überdeckten Pixel einfliessen und gewichte sie je nach überdecktem Flächenanteil.
Das nennt sich "box filter".
Solltest du also mit einer anderen "box filter" Implementierung vergleichen.
Ist zum Verkleinern ganz gut finde ich.Bilinear und Bikubisch sind IMO nicht wirklich zum Verkleinern geeignet - auf jeden Fall nicht für Verkleinerungen um mehr als Faktor 2.
-
Achso, meinst du, dass biliniear/bikubisch gar nicht alle überdeckten Pixel berücksichtigen sondern immer nur 4 heranziehen?
Habs mal grad in Gimp getestet und ein grosses weisses Bild mit ein paar wenigen verteilten schwarzen einzelpixeln bilinear stark verkleinern lassen, aber es trat nicht der auf der oberen Aussage zu erwartende Fall ein, dass sie dann entweder mit 196 oder ganz unsichtbar (255) im Zielbild erscheinen, sondern sie waren da.
D.h. dass Gimp dann ja doch mehr als 4 Pixel zum linearen Interpolieren heranzieht.
Benutzt das also auch einen box-filter, nennt es nur nich so?
Achja, auch bei Verkleinerungen mit nem Faktor von nur 1,1 wär ein nur vier pixel berücksichtigendes Verfahren schon ungeeignet, weil auch hier schon bis zu 9 pixel im Quellbild vom Zielpixel überdeckt werden können.Achja, und wieso ist der Boxfilter zum Verkleinern gut, aber zum vergrößern nicht?
Dann überdeckt meine box halt 1, 2 oder 4 Quellpixel.
-
Nur weil etwas irgendwo definiert ist, sagt nicht aus dass es nicht verschieden interpretiert werden kann und schon garnicht dass es nicht verschieden implementiert werden kann. und es gibt viele dinge die nicht definiert sind, z.b. in welchem farbraum man interpoliert.
zudem hat man fuer photoshop sicherlich hochbezahlte leute die nicht stumpf formeln niederschreiben, sondern auch ihre erfahrung und grips einfliessen lassen, natuerlich ist das resultat dann vielleicht nicht mathematisch korrekt, aber das ziel ist ein ganz anderes -> optisch gut zu sein.
-
Dobias schrieb:
Achja, und wieso ist der Boxfilter zum Verkleinern gut, aber zum vergrößern nicht?
Der Boxfilter ist einer der schlechtesten Filter die es überhaupt gibt. Die Begründung liegt in der Signaltheorie, da der Boxfilter eine Interpolation 0-ter Ordnung durchführt - er mittelt also nur die Werte die unter ihm liegen. Er ist übrigens auch zum Verkleinern nicht so richtig toll.
-
otze schrieb:
Der Boxfilter (...) ist übrigens auch zum Verkleinern nicht so richtig toll.
Wieso nicht?
p.S.: welcher Filter ist denn besser?
p.p.S.: ich behaupte nicht dass der Box-Filter für sämtliche Verkleinerungen der ideale Filter ist. Nur dass er ziemlich gut ist, und oft vollkommen ausreichend. Und auf jeden Fall besser als bilinear interpoliert.
-
Der Boxfilter (...) ist übrigens auch zum Verkleinern nicht so richtig toll.
Wieso nicht?
Wenn Du Dir die Frequenzantwort des Box-Filters anschaust siehst Du dass Frequenzen oberhalb der resultierenden Nyquist-Frequenz (> Sample-Rate/2) kaum bedaempft werden.
Diese koennen aber in dem neuen Signal (mit entsprechend kleinerer Sample-Rate) nicht abgebildet werden.Das Problem aeussert sich bei Texturen allerdings weniger weil man meistens sowieso bilineares Filtering verwendet das aehnliche Schwierigkeiten hat. Texturen sind darum in hinreichendem Masse vorgefiltert (oder der Artist hat erst gar keine Details reingemacht).
-
Schon klar.
Aber wer sagt dass das wichtig ist?
Der Box-Filter hat eine geringere Dämpfung im "Stop-Band" als andere Filter, OK.Für starke Verkleinerungen funktioniert er trotzdem sehr gut. Die Ergebnisse sind sehr scharf, es wird wenig Detail vernichtet, es gibt keinerlei Ringing. Kurz: die Bilder sehen einfach gut aus.
Wie schon gesagt: für bestimmte Anwendungen gibt es sicherlich bessere Alternativen. Deswegen würde ich aber nicht sagen dass ein Box-Filter grundsätzlich "schlecht" ist.