Seite 1 von 1
Matrix/Image resizing
Verfasst: Dienstag 8. Mai 2012, 15:32
von yiiit
Ich habe eine 28x28-Matrix, welche Grauwerte enthält, jeder Matrixeintrag stellt also einen Pixel dar und die Matrix symbolisiert sozusagen ein Bild.
Meine Frage ist nun, ob es mit Hilfe von numpy oder scipy oder sonstigen Bibliotheken eine Möglichkeit gibt, diese Matrix und damit das Bild auf eine beliebige Größe zu skalieren (z.B. 16x16 oder 32x32), das Bild sozusagen zu vergrößern oder zu verkleinern.
Für ein Subsampling auf 14x14 kann man einfach vier benachbarte Matrixelemente zu einem neuen zusammenfassen, für 7x7 dasselbe Verfahren wiederholen usw., aber gibt es eine Möglichkeit die Größe beliebig zu gestalten?
Grüße,
yiiit
Re: Matrix/Image resizing
Verfasst: Dienstag 8. Mai 2012, 16:39
von BlackJack
@yiiit: Man müsste die Punkte irgendwie interpolieren. Das einfachste wäre linear. Aus dem Kopf weiss ich nicht ob/was `numpy` da bietet — ich würde es wohl mit der „Python Imaging Library” machen, wenn es ein Bild werden soll. Die kann Bilder aus Numpy-Arrays erstellen und bietet verschiedene Interpolationsalgorithmen.
Re: Matrix/Image resizing
Verfasst: Mittwoch 9. Mai 2012, 08:50
von yiiit
Es geht halt um eine Klassifikation von Zeichen.. Interpolation ist mir auch schon in den Sinn gekommen, aber wie soll der Algorithmus aussehen, wenn ich zum Beispiel von 28x28 auf 26x26 gehen will? Wie bzw. zwischen welchen Zeilen muss ich interpolieren - wie machen das denn die einfachen Bildverarbeitungsprogramme?
EDIT: gelöst! Die PIL liefert eine Funktion (im.resize()), die genau das liefert, was ich brauche. Danke an BlackJack für den Tipp!
Re: Matrix/Image resizing
Verfasst: Mittwoch 9. Mai 2012, 09:26
von Trichter
Ich nehme mal an die Interpolieren das ganze Bild mit cubic splines oder linear (oder sonstwie). Dann hat man eine einfache Formel, in die man einfach die Koordinaten des gewünschten Bildpunktes einsetzt und dann den Grauwert/Farbwert an dieser Stelle erhält.
Angenommen du hast 28x28 Bildpunkte und willst zu 26x26 Bildpunkten kommen. Dann kannst du mittels cubic splines 28 Zeilen interpolieren. Diese Zeilen teilst du an 26 Punkten und erzeugst dir daraus ein Bild mit 26 Spalten (und 28 Zeilen). Jetzt interpolierst du die Spalten, erhältst also 26 neue Spalten, die du wiederum an 26 Stellen teilst (das ergibt dann 26 neue Zeilen) und schon hast du dein 26x26 Bild. Lässt sich mit Worten schlecht beschreiben, ich hab aber grad kein Bild zur Hand, dass das gut darstellt.
Re: Matrix/Image resizing
Verfasst: Mittwoch 9. Mai 2012, 09:51
von BlackJack
@yiiit: Schau doch einfach nach. In den Grafik-Programmen wird meistens „nearest neighbour”, „(bi)linear”, und „(bi)cubic” angeboten. Manchmal noch „lanczos”. Für all die Verfahren gibt es Tonnenweise Beschreibungen im Netz und in Büchern die sich mit den Grundlagen der Bildverarbeitung befassen. Und auch Implementierungen in OpenSource-Programmen, die man sich anschauen kann.
Ansonsten muss es doch auch Papers geben, die sich mit Klassifizierung von Zeichen anhand von Bitmaps beschäftigen und speziell auch so etwas wie Interpolation/Resampling beziehungsweise Transformationen im Allgemeinen beleuchten.
Re: Matrix/Image resizing
Verfasst: Mittwoch 9. Mai 2012, 13:09
von Dobi
@yiiit: Beim "im.resize(size, filter) => image" der PIL lohnt es sich (wenn du Zeit hast und ein hübsches Ergebnis haben willst), ANTIALIAS zu sagen, da lineare und kubische Interpolation bei starken Verkleinerungen gerne mal Moiré-Effekte produzieren. Im Prinzip ist diese "area interpolation" / der "box filter", der dabei verwendet wird, schon das, was du selbst vorgeschlagen hattest (28*28 nach 7*7 bedeutet von 16 Nachbarpixeln den Durchschnittswert zu nehmen). Nur wenn der Verkleinerungsfaktor keine ganze Zahl ist, werden die Randpixel der Box dann halt interpoliert.
Re: Matrix/Image resizing
Verfasst: Mittwoch 9. Mai 2012, 16:36
von yiiit
@dobi: ja, ich habe schon ein bisschen damit rumexperimentiert und auch gemerkt, dass Image.ANTIALIAS eindeutig die besten Ergebnisse liefert

letztlich bin ich voll und ganz zufrieden mit der Funktionsweise im Moment, vielen Dank!