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

Bilder vergleichen

 

Derak

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2008, 13:28     Titel: Bilder vergleichen
  Antworten mit Zitat      
Hallo,

ich hab zwar schon hier im Forum nach ein Lösung meines Problems gesucht aber nichts passendens gefundes.
Nun zu meinem Prob.

Ich habe zwei Bilder die in Größe und Auflösung eigentlich übereinstimmen müssten. Nun habe mit "edges" von jedem der beiden Bilder so ein "Kantenbild" erstellt. Nun würde ich gern die zwei Bilder miteinander vergleichen um zu sehen wie ähnlich sie sich sind. Gibt es da eine Methode in Matlab? Hab leider noch nicht so die Erfahrung mit dem Programm. Am ende soll eine grafische Auswertung mit Balken rauskommen wo da steht. Bild A gleicht Bild B zu 50% oder so in etwa.
Ich hoffe ihr könnt mir helfen.

hier mein code den ich bis jetzt hab.

Code:
original = imread('Bild A.jpg');

smalloriginal = original(1:4:size(original,1), 1:3:size(original,2),:);
subplot(2,2,1), image(smalloriginal), axis off, title('Bild A original');

edges = [];
edges(:,:,1) = edge(smalloriginal(:,:,1), 'sobel');
edges(:,:,2) = edge(smalloriginal(:,:,2), 'sobel');
edges(:,:,3) = edge(smalloriginal(:,:,3), 'sobel');
edgesAll = edges(:,:,1) + edges(:,:,2) + edges(:,:,3);
subplot(2,2,3), imshow(edgesAll), title('combined edges in one intensity image');

original2 = imread(Bild B.jpg');
smalloriginal2 = original2(1:4:size(original2,1), 1:3:size(original2,2),:);
subplot(2,2,2), image(smalloriginal2), axis off, title('Bild B original');
edges2 = [];
edges2(:,:,1) = edge(smalloriginal2(:,:,1), 'sobel');
edges2(:,:,2) = edge(smalloriginal2(:,:,2), 'sobel');
edges2(:,:,3) = edge(smalloriginal2(:,:,3), 'sobel');
edgesAll2 = edges2(:,:,1) + edges2(:,:,2) + edges2(:,:,3);
subplot(2,2,4), imshow(edgesAll2), title('combined edges in one intensity image');


danke schon mal für die Bemühungen


Derak

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2008, 16:18     Titel:
  Antworten mit Zitat      
da meine frage doch etwas schwieriger zu beantworten scheint, ändere ich die fragestellung ein wenig ab....

mir würde es schon reichen wenn es eine möglichkeit gäbe zwei bilder übereinader zu legen, diese zu vergleichen und eine art pixelmuster rausgekomme wo zu sehen ist in welchen punkten die bilder überein stimmen.

vom prinzip her so ähnlich wie bei diesem link wo nach "e" gesucht wird

http://www.informatik-forum.at/showthread.php?t=38099
 
Derak

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2008, 08:19     Titel:
  Antworten mit Zitat      
keiner eine Idee. Schade Sad
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 23.10.2008, 13:32     Titel:
  Antworten mit Zitat      
Hallo Derak,

ich kenne mich mit der Image Processing Toolbox leider nicht so aus, aber dafür ein bisschen mit Mustererkennung.

Das einfachste wäre die Berechnung der euklidischen Distanz deiner beiden edge matrizen. D.h. einfach:
Code:
Wenn du nun den Prozentsatz der Übereinstimmung wissen möchtest. Musst du nur noch das Maximum und das Minimum bestimmen. Minimum sollte bei Null liegen also = 100 % . Maximum ist schon etwas schwieriger könnte aber zum Beispiel die Größe der Matrix also M*N mal dem maximalen Wertebereich sein. Also zum Beispiel 1 bis 255 = 256. Wenn das für alle Werte gelten würde wären die Bilder zu 0 % ähnlich.

Natürlich ist das eine sehr einfache Method und wenn deine edges nur um ein paar Pixel verschoben sind, kann das schon zu einer sehr niedrigen Übereinstimmung führen. Deswegen gibt es noch andere Distanzberechnungsmethoden:
http://en.wikipedia.org/wiki/Distance

z.B. die Mahalanobis distance

Du könntest aber auch versuchen die Distanz mehrmals mit verschieden verschobenen Bildern zu berechnen und das beste Ergebnis benutzen.

Ich hoffe das gibt dir eine kleine Hilfe oder eröffnet die Diskussion etwas.

Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 23.10.2008, 14:11     Titel:
  Antworten mit Zitat      
Um Signale zu vergleichen nutzt man die Kreuzkorrelation. Bei Bildern dementsprechend eine 2D-Kreuzkorrelation.

Code:


Das ganze ist sehr rechenintensiv, also vorher testen an kleineren Bildern bzw. falls nötig die eigentlichen Bilder runterskalieren.
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 23.10.2008, 14:39     Titel:
  Antworten mit Zitat      
Vielen dank euch beiden. Da hab ich jetzt paar Ansätze die ich ausprobieren kann. Very Happy

Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 28.10.2008, 14:52     Titel:
  Antworten mit Zitat      
Hallo,

ich hab mich na einer kurzen Pause mal wieder mit diesem Thema befasst. Ich habe meinen Code auch etwas geändert bzw. die Bilder.
Ich wollte nun eine Kreuzkorrelation mit xcorr2 bzw. normxcorr2,durchführen um die zwei Bilder deckungsgleich zu machen aber Matlab bringt dann immer die Fehlermeldung:

??? Undefined command/function 'xcorr2'

bzw.

??? Attempt to reference field of non-structure array.

Error in ==> normxcorr2>ParseInputs at 226
error(eid,'%s',msgstruct.message);

Error in ==> normxcorr2 at 56
[T, A] = ParseInputs(varargin{:});


hab meinen code bisher soweit umgebaut.

Code:

clc
clear all
bg=imread('Grafik1.jpg');

figure(1)
title('Testbilder');
subplot(2,2,1)
imshow(bg)
title('Bild 1');
subplot(2,2,3)
imshow(bg)
title('Bild 2');
subplot(2,2,2)
a = image (bg,'XData',[1 100],'YData',[1 100]);
title('beide Bilder übereinandergelegt');
axis off;
hold on;
b = image (bg,'XData',[5 105],'YData',[1 105]);
set(b,'AlphaData',0.3);
slider1=uicontrol('Style','slider','Position',[0.15 0.04 0.3 .04],...
'Units','normalized','Value',1,'Max',10,'Min',0,...
'Callback','disp(''slider1'')');
subplot(2,2,4)
title('auto')
axis off
 


meine Frage wäre jetzt wie ich die Kreuzkorrelation durchführen muss damit die zwei Bilder wieder übereinander gelegt werden. xcorr2 geht bei mir nicht und normcorr2 bringt Fehlermeldung.

Ein weiteres Problem was dazu gekommen ist,das die Verschiebung der Bilder zueinander momentan noch per Hand eingestellt ist.
Code:

set(b,'AlphaData',0.3);
 


für die 0.3 würd ich gern die Werte vom Slider nehmen. Also wenn man den Slider bewegt soll sich das obere Bilder oben rechts dementsprechend verschieben. Gibt es da eine Möglichkeit das zu realisieren. In der Suche hab ich nicht wirklich was brauchbares gefunden oder vielleicht auch überlesen.Für Hinweise wäre ich sehr dankbar.

Im Anhang findet ihr ein Screenshot wie es momentan aussieht.

Gruß
Derak

figure 1.JPG
 Beschreibung:

Download
 Dateiname:  figure 1.JPG
 Dateigröße:  38.2 KB
 Heruntergeladen:  1618 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
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.