Transformation eines Bildes zB. 512x512 in 400x400

Hallo,
suche einen guten, genauen und schnellen Transformations-Algorithmus, um Bilder eines Pixelformates in ein anderes Pixelformat zu überführen. Der Hintergrund ist es, Bilder verschiedener Quellen digital miteinander zu vergleichen, zu subtrahieren usw.
Ursprünglich glaubte ich an die FFT, aber ich bin mit den Stützstellen festgelegt und ein Umrechnen dieser wäre wohl zu aufwendig. Hat jemand einen guten Tip?

E. W.

Hallo,

im Prinzip ganz einfach: Alle Pixel sind Rechtecke (vielleicht sogar Quadrate). Wenn das Zielpixel mehrere Quellpixel überdeckt, werden deren Werte proportional zur jeweiligen Überdeckungsfläche gemittelt.

Einfacher Fall: 800 x 400 in 400 x 400, immer 2 nebeneinanderliegende Pixel mitteln.

Wozu FFT?

Gruss Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke Danke, aber bei ganzzahligen Verkleinerungen hätte ich die Frage nicht stellen brauchen, wie verhält es sich bei nichtganzzahligen Verkleinerungen und Vergrößerungen?

Danke

E. W.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Danke Danke, aber bei ganzzahligen Verkleinerungen hätte ich
die Frage nicht stellen brauchen, wie verhält es sich bei
nichtganzzahligen Verkleinerungen und Vergrößerungen?

Hallo Eric,

ganzzahlig war ja nur als Beispiel gedacht. Dein Bild 512 x 512 besteht ja aus 512^2 Quadraten, das gewünschte Bild aus 400^2 Quadraten mit der Kantenlänge 512/400 * derjenigen des Originals. Welche Grösse du dafür nimmst, µ oder km, spielt keine Rolle, du kannst auch die originale Pixelgrösse einsetzen. Du legst das 400er-Gitter auf das Originalbild mit dem 512er-Gitter und guckst für jedes 400er-Quadrat nach, auf welchen 512er-Quadraten es liegt und mit welchem Flächenanteil. Das erste oben links bedeckt das erste 512er ganz und die rechts, unten und rechtsunten gelegenen etwas. Als Maximum belegt ein Pixel, das über einem 512er zentriert ist, alle angrenzenden, also 9 Originalpixel. Bei anderen Grössenverhältnissen können das natürlich beliebig viele sein, also in der Software einfach abklappern.

Die Werte der bedeckten Pixel multiplizierst du mit dem bedeckten Flächenanteil / Fläche eines 400er-Pixels und zählst sie zusammen, damit bekommst du einen gewichteten Mittelwert der Anteile am neuen Pixel. Das ist qualitativ das beste, was man errechnen kann.

Im Grunde ist das wirklich nur die nicht-diskrete Version des Vorgehens bei ganzzahligen Verhältnissen.

Gruss Reinhard

Hallo Reinhard,

Das ist qualitativ das beste, was
man errechnen kann.

Nein das stimmt nicht.

Dieses Verfahren mittelt nur über die Pixel und ist damit ein
Tiefpass.

Mathematisch hast du mit einer rechteck Funktion gefaltet, wenn
man sich das im Frequenzbereich anschaut kommt dann eine si Funktion
raus und das ist nicht das Beste was man errechnen kann.

Gruß
Stefan

Hallo Eric,

suche einen guten, genauen und schnellen

Was denn nu? :smile:
Das Eine schließt das Andere ein wenig aus.

Ursprünglich glaubte ich an die FFT, aber ich bin mit den
Stützstellen festgelegt und ein Umrechnen dieser wäre wohl zu
aufwendig. Hat jemand einen guten Tip?

Du warst schon auf dem richtigen Weg, du mußt nur weiter denken.

  1. DFT wäre die Lösung, dann kannst du beliebig scalieren wie du
    möchtest. Da sowas allerdings dann keinesfalls schnell ist, müssen
    wir noch etwas weiter grübeln.

  2. Warum im Frequenzbereich das Problem lösen? Falten im Ortsbereich
    (bei diskreten Werten) ist doch viel einfacher.

-> Mit einem 2 dimensionalen Filterkern über das Bild rutschen

  1. Die Koeffizenten des Kerns ergeben sich aus der inversen DFT
    deiner Wunschfunktion im Frequenzbereich (in deinem Fall ein
    Rechteck).
    Wenn man ein Rechteck zurücktransformiert erhälst du eine si Funktion
    als Filterkoeffizienten.

Die Qualität der Skalierung wird dann von der Größe deines Filter
(Anzahl koeffizienten) bestimmt. Üblicherweise benutzt man 3 - 7
Tap Filter.

Gruß
Stefan

Hallo Reinhard,

im Prinzip ganz einfach: Alle Pixel sind Rechtecke (vielleicht
sogar Quadrate). Wenn das Zielpixel mehrere Quellpixel
überdeckt, werden deren Werte proportional zur jeweiligen
Überdeckungsfläche gemittelt.

Einfacher Fall: 800 x 400 in 400 x 400, immer 2
nebeneinanderliegende Pixel mitteln.

Naja, das ist die Technisch primitive version, welche aber Verzerrungen verursachst. Also am Ende entspricht der Abstand zwischen 2 Pixeln Stellenweise dem Originalabstand und an den Interpolierten Stellen dem doppelten …

Die exaktere Methode wäre durch die 512 Pixel eine Bezzier -Funktion zu legen und dann diese Kurve in 1/400stel Schritten abzutasten. Damit bleibt der Abstand zwischen 2 Pixel immer gleich.

MfG Peter(TOO)

Nein das stimmt nicht.

Dieses Verfahren mittelt nur über die Pixel und ist damit ein
Tiefpass.

Mathematisch hast du mit einer rechteck Funktion gefaltet,
wenn
man sich das im Frequenzbereich anschaut kommt dann eine si
Funktion
raus und das ist nicht das Beste was man errechnen kann.

Gruß
Stefan

Hallo Stefan,

natürlich ist ein Tiefpass, wenn weniger Pixel herauskommen sollen, was denn sonst? Wenn die Auflösung halbiert wird, dann auch die obere Grenzfrequenz, wo soll die Information sonst sitzen? Zwischen den Pixeln?

Gruss Reinhard

Hallo Reinhard!

natürlich ist ein Tiefpass, wenn weniger Pixel herauskommen
sollen, was denn sonst? Wenn die Auflösung halbiert wird, dann
auch die obere Grenzfrequenz, wo soll die Information sonst
sitzen? Zwischen den Pixeln?

OK, doof ausgedrückt.

Wenn ich die Auflösung halbiere und dies tue durch Mittelung von
vier Pixeln, dann habe ich eben nicht nur die Grenzfrequenz geändert,
sondern auch die anderen (noch darstellbaren) Frequenzen.

Die Operation die dabei durchgeführt wird nennt sich Faltung
(so’n eckliges Doppelintegral). Deine Koeffizienten sind für
alle Pixel 1 da jedes Pixel mit dem gleichen Gewicht teilnimmt.
Wenn man diese Faltung von Rechteckfunktion und Orginal ins
Frequenzspektrum transformiert dann erhält man die transformierte
Orginale multipliziert mit der si-Funktion.
Das ergibt dann über den gesamten Frequenzverlauf Änderungen, was
man ja eigentlich nicht haben wollte.

Gruß
Stefan

Hallo Stefan,
wenn du mit dem Faltungskern „über das Bild rutscht“ bleibt die Größe der Bildmatrix erst mal gleich. Du müsstest Eric also erst mal erklären, wie er gleichzeitig die Bildgröße reduzieren könnte …

Über eine 2-d FFT (bzw. DFT) hin und zurück lässt sich das Ganze in einem Rutsch relativ elegant machen.

Gruß Kurt