Frage zu Interpolationsalgorithmus (BV)

alphacast

Ensign
Registriert
Apr. 2004
Beiträge
250
N'Abend,

ich habe einen schnellen Prototyp eines einfachen Tools geschrieben, welches ohne vorgefertigte Bildverarbeitungsbibliotheken affine Transformationen auf Pixelebene eines 8-Bit Graufwertbildes durchführt, also Translation, Rotation, Scherung, Spiegelung und Skalierung.

Klappt auch soweit, natürlich gibt es aber bei der Rotation und der Skalierung schwarze Punkte im Ergebnisbild.

Ich möchte jetzt eine Interpolation so durchführen, dass den fehlenden Pixeln der gewichtete Mittelwert der Nachbarpixel zugeordnet wird, dies soll ein qualitativ sehr hochwertiges Verfahren sein.

Ich verstehe nur gerade nicht, wie man etwas wichten soll, was in alle Richtungen den Abstand von einem Pixel hat ... könnte mir da einer bitte kurz auf die Sprünge helfen?

Danke und schönes WE! :)
 
Naja, das hängt halt davon ab, wieviele Nachbarpixel du miteinbeziehen magst.
Z. B. kannst du ein einfaches Verfahren machen, indem du die Pixel unten, oben, rechts und links je mit eins und den Pixel in der Mitte mit zwei gewichtest (kreuzförmig, blöd zu beschreiben).

Allerdings musst du dich ja nicht auf die unmittelbar angrenzenden Pixel beschränken. Du kannst ja auch weiter entfernte Pixel miteinbeziehen und die halt dann entsprechend weniger gewichten.

Ich hoffe, das war verständlich.
 
Zuletzt bearbeitet:
Danke, aber ich glaub nicht, dass es das ist, was ich suche! :(

Schon klar, dass man entweder die 4er oder die 8er Nachbarschaft benutzen kann, aber mal unabhängig davon sieht das Problem meiner - vielleicht falschen Einschätzung nach - viel mehr so aus, dass man den Ergebnisvektor des fehlenden Pixels nach Berechnung der Transformationsmatrix betrachten muss.

Also z.B. kommt bei der Rotation ein Tupel x/y = 1,7/2,3 heraus.... ab jetzt wirds unsicher (!!), dann wird das Pixel vermutlich bei (1/2) gesetzt. Anhand des eigentlichen Tupels und der der umliegenden Pixel könnte man ja nun Wichtungen anstreben.

Allerdings wirft sich mir gerade die Frage auf, ob in dem oben genannten Fall dann nicht u.U. mehre Pixel am gleichen Ort gespeichert werden. :eek: Egal, ich denke es ist aber klar geworden, wo hier gewichtet werden soll. Wichtungsfaktor soll auf jeden Fall der Abstand zum fehlenden Pixel sein.
 
Hallo alphacast,

wenn Du krumme Werte herausbekommst, werden sicher manche Pixel zusammenfallen.

Ich würde dann den die umliegenden Pixel nicht auf Grundlage der Pixel in der Zielbitmap berechnen sondern auf Grundlage der transformierten Pixel aus der Quellbitmap.

Ebenso der Zielpixel setzt sich dann aus dem gewichteten Mittelwert aller Pixel zusammen die auf den selben Zielpixel fallen.

In Konsequenz wird jeder Zielpixel aus dem gewichteten Mittelwert seiner umgebenden transformierten Quellpixel berechnet.

MfG

Arnd
 
Für ein wirklich korrektes Verfahren musst du dir im Prinzip überlegen welche Fläche ein Pixel vom Ergebnisbild im Eingangsbild abdeckt. Die Flächenanteile ergeben die korrekten Gewichte für die jeweiligen Farben (oder auch Grautöne bei dir).

Farbinformationen kannst du bilinear interpolieren. Da das ganze bei der Skalierung etwas einfacher geht, empfehle ich damit anzufangen. ;)
 
Jo, ich glaub damit kann ich was anfangen ... danke.
 
Bei weiteren Fragen einfach fragen. :)
Hab ja nicht soo viele Details rüberwachsen lassen, weil ich nicht weiß wie der Kenntnisstand bei dir ist.
 
Green Mamba schrieb:
Bei weiteren Fragen einfach fragen. :)
Hab ja nicht soo viele Details rüberwachsen lassen, weil ich nicht weiß wie der Kenntnisstand bei dir ist.

Danke, aber ich hab es schon fertig. Ich hatte das auch schon so ähnlich in Tönnies "Grundlagen der Bildverarbeitung" gelesen, nur irgendwie hat mir der Ansatz gefehlt.

Ich hab jetzt das gesamte Zielbild aus Interpolation aufgebaut, statt nur die Artefakte zu bearbeiten, das soll am Exaktesten sein.

Die Grauwerte werden nun quasi bilinear interpoliert, also vom Zielpixel ausgegangen werden Flächenanteile an Quellpixeln ermittelt und daraus der Grauwert gewichtet gemittelt.

Die Rückrechnung auf die Quellpixel erfolgte mit:

(x_alt y_alt)^T = Trafomatrix^-1 * (x_neu y_neu)^T - Translationsvektor

Allerdings waren algorithmisch noch ein paar Probleme mit den Arraygrenzen zu lösen.
 
Zuletzt bearbeitet:
Zurück
Oben