WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Transformationsmatrix zwischen zwei Bildern bestimmen

 

computerman
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2013, 19:32     Titel: Transformationsmatrix zwischen zwei Bildern bestimmen
  Antworten mit Zitat      
Hallo zusammen,

ich habe zwei Bilder von dem eines im Vergleich zu dem anderen, verschoben und anders skaliert ist. Nun möchte ich die (Ähnlichkeits-) Transformations-Matrix zu diesen Bildern finden. Dazu wollte ich das Verfahren anwenden, welches in Richard Szeliski großartigen Tutorial zum Image Stitching auf Seite 29 beschrieben ist.

Im Grunde geht es darum ein lineares Gleichungssystem Ax = b zu lösen, wobei:

A = \sum\limits_{i} J_{x'}^{T}(x_i)*[\nabla I_1^T(x_i') * \nabla I_1(x_i')] * J_{x'}(x_i)

b = -\sum\limits_{i} J_{x'}^{T}(x_i)*[e_i*\nabla I_1^T(x_i')]

Kein Problem also Wink Das ganze ist ein iteratives Verfahreren, mit jedem Schritt sollte die Lösung also etwas besser werden.

x_i = \begin{pmatrix} x \\ y \end{pmatrix} stellt die Bildkoordinaten dar, welche auf Werte zwischen -1 und 1 normiert wurden (vgl. S. 3)

x_i' sind die Bildkoordinaten transformiert mit der aktuellen Transformationsmatrix

e_i = I_1(x_i') - I_0(x_i) (vgl. S. 16)

I_1(x_i') bzw. I_0(x_i) entsprechen den Intensitätswerten der Bilder.

J_{x'} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix}

Eigentlich ist J_{x' für mein Problem anders definiert, aber im ersten Schritt versuche ich erstmal nur die Translation zu bestimmen. Die anderen Modelle sind auf Seite 29 beschrieben.


Ich probiere nun schon seit einer Woche dies zum Laufen zu bekommen, aber es will einfach nicht und ich finde den Fehler nicht. Ein Iterationsschritt sieht bei mir so aus:

Code:

function deltaP = doIteration()
   global wn hn Gdx Gdy imgQn imgDn P T
   #imgQn ist das Quellbild normiert auf Werte zwischen 0 und 1
   #imgDn ist das Zielbild normiert auf Werte zwischen 0 und 1
   #P ist der Parameter Vektor, welcher bei der Translation (tx,ty) ist
   #T ist die Transformationsmatrix = [1,0,tx;0,1,ty]
   #Gdx Gdy entpricht gradient(imgDn);

   A = zeros(2,2);
   b = zeros(2,1);
   stepX = 2 / wn;                     #2 / (Bildbreite-1)
   stepY = 2 / hn;                     #2 / (Bildhöhe-1)

   for xn=-1:stepX:1                     #Über die normierten Pixelkoordinaten laufen
      for yn=-1:stepY:1
         [xnt, ynt] = transCoords(xn, yn, T);         #Transformationsmatrix auf normierte Koordinaten anwenden
         [xp, yp]   = deNormCoords(xn,yn);         #Nicht transformierte Koordinaten denormalisieren                    
         [xpt, ypt] = deNormCoords(xnt, ynt);         #transformierte Koordinaten denormalisieren        
         JC = jacobi(xn, yn);               #Jacobi Matrix erzeugen
         GD = [biInt(Gdx, xpt, ypt), biInt(Gdy, xpt, ypt)];   #Gradienten Vektor vom ZielBild erzeugen
         
         A = A + JC' * (GD' * GD) * JC;
         b = b + JC' * (biInt(imgDn, xpt, ypt) - biInt(imgQn, xp, yp)) * GD';

       endfor
   endfor
   A
   b = -b
   deltaP = A \ (b');
   P = P + deltaP';

   T = [1, 0, P(1,1); 0, 1, P(1,2)]
endfunction
 



Das komplette Programm habe ich angehängt. So wie ich es implementiert habe, würde es nur bei quadratischen Ich bin kein Matlab Experte und bitte es zu entschuldigen wenn da komische Befehlsfolgen stehen.


Ansonsten bedanke ich mich schon mal bei denen die bis hierhin gelesen haben. Ich wäre unendlichdankbar, wenn jemand den Fehler finden könnte. Aber auch ein Link auf eine funktionierende Implementierung dieses Verfahrens würde helfen.

Viele Grüße,
computerman

simtrans.m
 Beschreibung:

Download
 Dateiname:  simtrans.m
 Dateigröße:  2.97 KB
 Heruntergeladen:  804 mal
Private Nachricht senden Benutzer-Profile anzeigen


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.07.2013, 09:42     Titel:
  Antworten mit Zitat      
Hallo

Was nutzt du, Matlab, oder Octave?
Private Nachricht senden Benutzer-Profile anzeigen
 
computerman
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2013, 10:19     Titel:
  Antworten mit Zitat      
Hi,

Ich hab das in Octave geschrieben, weil mir zuhause kein Matlab zur Verfügung steht. Ist das wichtig? Ich muss zugeben, dass ich es noch nicht in Matlab getestet habe, weil ich dachte dass die Programme weitgehend kompatibel sind. Das kann ich aber noch nachholen.

Schönen Gruß,
computerman
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.07.2013, 13:28     Titel:
  Antworten mit Zitat      
Hallo

Nun ja, weil dein Code ist jetzt in Octave Style( wie Kommentare oder endfunktion) und nicht in Matlab Style geschrieben. Und deswegen nicht in Matlab lauffähig. Matlab und Octave sind nicht zu 100 % kompatibel, sondern es gibt so einige Unterschiede zw. den beiden. Man kann aber auch den Code in Matlab Style gestalten, das versteht Octave. Die grundlegenden Funktionen sind identisch, sonst muss man immer schauen, ob die Programme kompatibel sind.

Außerdem ist dein Programm, kann entweder ein Funktionsscript sein, also nur aus Funktionen und Unterfunktionen bestehen oder nur ein Script sein, aber doch nicht beides. Bitte erklären wie du dein Code nutzt!!!

Die meisten sind in Matlab unterwegs und wenn der Fehler in Octave auftaucht, können dir die meisten da schon nicht mehr weiter helfen.

Gibt dein Programm irgendwelche Fehlermeldungen?

Zuletzt bearbeitet von denny am 29.07.2013, 16:39, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
computerman
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 26.07.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2013, 16:27     Titel:
  Antworten mit Zitat      
Oh, das war mir nicht bewusst. Ich hatte es nur gelesen und dies für bare Münze genommen. Ich habe jetzt eine Matlab Version angehängt.

Die Funktionsweise ist folgende. Es wird ein 10x10 großes "Bild" erstellt mit einem 3x3 großem weißen Rechteck, auf grauem Grund. Dieses wird mit einer Transformationsmatrix T=[1,0,-3;0,1,-3]; verschoben. Ziel ist es nun durch mehrere Iterationen diese Transformationsmatrix zu finden.

MATLAB:
Code:
doIteration=simtrans2;
doIteration()
doIteration()
...


Octave:
Code:
source(simtrans.m)
doIteration()
doIteration()
...


Beide Versionen verhalten sich identisch, einen Fehler produziert keine. Ich werde wahrscheinlich die oben genannten Formeln falsch umgesetzt haben. Ich weiß das es viel verlangt ist, sich in ein Programm einzuarbeiten und einen semantischen Fehler zu finden, aber vielleicht interessiert das Thema ja den ein oder anderen.

Beste Grüße,
computerman

simtrans2.m
 Beschreibung:

Download
 Dateiname:  simtrans2.m
 Dateigröße:  2.98 KB
 Heruntergeladen:  785 mal
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 31.07.2013, 10:44 Uhr von Jan S
Von Bildverarbeitung nach Octave-Forum
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.