2015-03-18 10 views
5

Ich habe zwei Bilder, die ähnlich sind, aber unterscheiden sich in Ausrichtung und Größe. Ein Beispiel kann unten gesehen werden:Passende Bilder mit verschiedenen Orientierungen und Skalen in MATLAB

enter image description here enter image description here

Gibt es eine Möglichkeit, die beiden Bilder übereinstimmen?

Ich habe Procrustes Formanalyse verwendet, aber gibt es andere Möglichkeiten?

+0

Sie benötigen eine logarithmisch-polare comparaison verwenden ... keine Ahnung, ob es bereits in Matlab oder in einer Matlab Toolbox implementiert ist ... – Alexxx

+2

würde ich Bildregistrierung verwenden. Suchen Sie eine Reihe von Schlüsselpunkten, die zwischen den beiden Bildern übereinstimmen, und suchen Sie dann eine Homo- grafie/Transformations-Matrix, die die beiden zusammenführt. BTW, bevor ich eine Antwort schreibe, haben Sie die Computer Vision Toolbox? – rayryeng

+1

Dies könnte Ihnen einige Ideen geben: [Algorithmusverbesserung für Coca-Cola kann die Erkennung formen] (http://stackoverflow.com/q/10168686/2545927) – kkuilla

Antwort

6

Überprüfen Sie Find Image Rotation and Scale Using Automated Feature Matching Beispiel in der Computer Vision System Toolbox.

enter image description here

Es zeigt, wie Interesse Punkte zu erkennen, zu extrahieren und Spiel verfügt über Deskriptoren und die Transformation zwischen den beiden Bildern berechnen.

+1

@rayryeng, es gibt viele von ihnen. Sie sollten sie überprüfen :) http://www.mathworks.com/help/vision/examples.html – Dima

3

Sie können ein vernünftiges Ergebnis Sie folgendermaßen vorgehen erhalten:

  • SIFT Detect Punkte in beiden Bildern. Zum Beispiel mit der vlfeat Lib.
  • Spiel SIFT-Deskriptoren Lowe Regel verwenden, implementiert durch vlfeat mit vl_ubcmatch
  • Verwenden RANSAC eine Teilmenge von passenden Punkten zu finden, die am Beispiel der Harris-Feature-Punkte bis zu einem gewissen Homografie H. haften kann auf der Website von Peter Kovesi zu sehen ist, nächste zu RANSAC selbst und anderen nützlichen Funktionen.

Das erste Ergebnis:

enter image description here

17

Hier ist etwas, das Sie zu erhalten begonnen. Was Sie fragen, ist ein klassisches Problem, bekannt als image registration. Die Bildregistrierung sucht nach der korrekten Homographie, die ein Bild aufnimmt und mit einem anderen abgleicht. Dies beinhaltet das Finden von Interessen oder Schlüsselpunkten, die zwischen den zwei Bildern gemeinsam sind, und das Bestimmen, welche Schlüsselpunkte zwischen den zwei Bildern übereinstimmen. Sobald Sie diese Punktepaare haben, bestimmen Sie eine Homographiematrix und verformen eines der Bilder so, dass sie mit dem anderen mit dieser Matrix ausgerichtet sind.

Ich gehe davon aus, dass Sie die Computer Vision und Image Processing Toolboxes haben, die Teil von MATLAB sind. Wenn nicht, dann ist die Antwort, die Maurits gab, eine gute Alternative, und die VLFeat Toolbox ist eine, die ich auch benutzt habe.

Zuerst lassen Sie uns direkt von Stackoverflow in den Bildern lesen:

im = imread('http://i.stack.imgur.com/vXqe8.png'); 
im2 = imread('http://i.stack.imgur.com/Pd7pt.png'); 

im_gray = rgb2gray(im); 
im2_gray = rgb2gray(im2); 

Wir müssen auch die keypoint Erkennungsalgorithmen ein Graustufenbild erfordern in Graustufen konvertieren. Als nächstes können wir jeden Feature-Erkennungsalgorithmus verwenden, der Teil von MATLABs CVST ist. Ich werde SURF verwenden, da es im Wesentlichen dasselbe wie SIFT ist, aber mit einigen kleinen, aber wichtigen Unterschieden. Sie können die detectSURFFeatures-Funktion verwenden, die Teil der CVST-Toolbox ist und Graustufenbilder akzeptiert. Die Ausgabe ist eine Struktur, die eine Reihe von Informationen über jeden Merkmalspunkt enthält, den der Algorithmus für das Bild ermittelt hat. Lassen Sie uns das auf beide Bilder anwenden (in Graustufen).

points = detectSURFFeatures(im_gray); 
points2 = detectSURFFeatures(im2_gray); 

Sobald wir die Eigenschaften erkennen, ist es nun an der Zeit zu Extrakt die Deskriptoren, die diese keypoints beschreiben . Dies kann mit extractFeatures erfolgen. Dies nimmt ein Graustufenbild und die entsprechende Struktur auf, die von detectSURFFeatures ausgegeben wurde. Die Ausgabe ist eine Reihe von Merkmalen und gültigen Schlüsselpunkten nach einer gewissen Nachbearbeitung.

[features1, validPoints1] = extractFeatures(im_gray, points); 
[features2, validPoints2] = extractFeatures(im2_gray, points2); 

Jetzt ist es Zeit, die Funktionen zwischen den beiden Bildern anzupassen.

indexPairs = matchFeatures(features1, features2); 

indexPairs ist ein 2D-Array, wo die erste Spalte, die Sie sagt, die Punkt-Feature aus dem ersten Bild mit dem aus dem zweiten Bild,: Das kann mit matchFeatures und es dauert in den Zügen zwischen den beiden Bildern durchgeführt werden in der zweiten Spalte gespeichert. Wir würden dies verwenden, um in unsere gültigen Punkte zu indizieren, um herauszufinden, was tatsächlich passt.

Wir können dann zeigen, welche Punkte durch Verwendung von showMatchedFeatures wie folgt übereinstimmen. Wir können beide Bilder nebeneinander legen und Linien zwischen den übereinstimmenden Schlüsselpunkten zeichnen, um zu sehen, welche zusammenpassen.

figure; 
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage'); 

Dies ist, was ich bekommen:

enter image description here

Es ist nicht perfekt, aber es am meisten findet sicherlich konsistente Übereinstimmungen zwischen den beiden Bildern.

Nun, was wir als nächstes tun müssen, ist die Homographie-Matrix zu finden und die Bilder zu verzerren. Ich werde estimateGeometricTransform verwenden, so dass wir eine Transformation finden können, die eine Reihe von Punkten zu einer anderen verzerrt. Wie Dima in seinen Kommentaren zu mir unten notiert, bestimmt diese robust die beste Homographiematrix über RANSAC. Wir können estimateGeometricTransform wie so nennen:

tform = estimateGeometricTransform(matchedPoints1.Location,... 
    matchedPoints2.Location, 'projective'); 

Der erste Eingang nimmt in einem Satz von Eingangs Punkte, die die Punkte, die Sie zu transformieren. Die zweite Eingabe nimmt einen Satz von Basispunkten auf, die die Referenz Punkte sind. Mit diesen Punkten wollen wir uns messen.

In unserem Fall wollen wir die Punkte aus dem ersten Bild verzerren - die Person, die aufsteht und sie dem zweiten Bild anpasst - die Person, die auf seine Seite lehnt, und so sind die ersten Eingaben die Punkte aus dem ersten Bild und die zweite Eingabe sind die Punkte von dem zweiten Bild.

Für die übereinstimmenden Punkte möchten wir auf das Feld Location verweisen, da diese die Koordinaten enthalten, an denen die tatsächlichen Punkte zwischen den beiden Bildern übereinstimmen. Wir verwenden auch projective, um Skalierung, Scherung und Rotation zu berücksichtigen. Die Ausgabe ist eine Struktur, die unsere Transformation von Punkten enthält.

Was wir als nächstes tun werden ist imwarp zu Warp das erste Bild, so dass es mit dem zweiten ausgerichtet ist.

out enthält unser verzogenes Bild.Wenn wir das zweite Bild und dieses Ausgangsbild nebeneinander gezeigt:

figure; 
subplot(1,2,1); 
imshow(im2); 
subplot(1,2,2); 
imshow(out); 

Das ist, was wir bekommen:

enter image description here

Ich würde sagen, das ist ziemlich gut, denken Sie nicht?


Für Ihr Kopieren und Einfügen von Vergnügen, hier ist es, was der vollständige Code wie folgt aussieht:

im = imread('http://i.stack.imgur.com/vXqe8.png'); 
im2 = imread('http://i.stack.imgur.com/Pd7pt.png'); 

im_gray = rgb2gray(im); 
im2_gray = rgb2gray(im2); 

points = detectSURFFeatures(im_gray); 
points2 = detectSURFFeatures(im2_gray); 

[features1, validPoints1] = extractFeatures(im_gray, points); 
[features2, validPoints2] = extractFeatures(im2_gray, points2); 

indexPairs = matchFeatures(features1, features2); 

matchedPoints1 = validPoints1(indexPairs(:, 1), :); 
matchedPoints2 = validPoints2(indexPairs(:, 2), :); 

figure; 
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage'); 

tform = estimateGeometricTransform(matchedPoints1.Location,... 
    matchedPoints2.Location, 'projective'); 

out = imwarp(im, tform); 

figure; 
subplot(1,2,1); 
imshow(im2); 
subplot(1,2,2); 
imshow(out); 

Neben

Beachten Sie, dass ich verwendet, um den Standard Parameter für alles ... also detectSURFFeatures, matchFeatures usw. Sie müssen möglicherweise mit den Parametern herumspielen, um konsistente Ergebnisse über verschiedene Bilderpaare zu erhalten, die Sie versuchen. Das überlasse ich dir als Übung. Sehen Sie sich alle oben verlinkten Links in Bezug auf die einzelnen Funktionen an, damit Sie mit den Parametern nach Ihrem Geschmack spielen können.


Viel Spaß und viel Glück!

+0

'cp2tform' ist veraltet. Verwenden Sie 'fitgeotform', um lineare Anpassungen nach der Methode der kleinsten Quadrate durchzuführen, oder' schätzenGeometricTrasnform', um eine robuste Anpassung mithilfe von RANSAC durchzuführen. Außerdem wurde "imtransform" zugunsten von "imwarp" veraltet. – Dima

+0

@Dima - 'fitgeotform' habe ich nicht, weshalb ich' cp2tform' verwendet habe. Ich verwende MATLAB R2013a. Wenn ich eine neuere Version von MATLAB hätte, würde ich ganz sicher 'fitgeotform' verwenden. Ich habe allerdings 'imwarp'. FWIW, vielen Dank für den Tipp. – rayryeng

+0

@Dima - Nizza. Sieht so aus, als hätte ich 'geschätztGeometricTransform'. Ich werde meine Antwort ändern. – rayryeng

0

Dies ist eher ein anderer Ansatz als der Rest. Feature-basierte Registrierungsmethoden sind robuster, aber mein Ansatz ist möglicherweise nur für Ihre Anwendung nützlich, deshalb schreibe ich ihn hier auf.

  • Legen Sie das Referenzbild (Ich werde es nennen Modell) und das Bild, das Sie mit dem Modell vergleichen wollen
  • Berechnen Sie die Histogramme der beiden Bilder
  • die beiden Histogramme vergleichen. Es gibt viele Möglichkeiten, dies zu tun. Hier verwende ich Kreuzung und Korrelation
  • Histogram Intersection: Berechnen Sie die Histogramm-Schnittpunkt und normalisieren Sie es, indem Sie es durch die Anzahl der Pixel im Modell Histogramm dividieren. Dadurch erhalten Sie einen Wert zwischen 0 und 1.

    image = imread('Pd7pt.png'); 
    model = imread('vXqe8.png'); 
    grImage = rgb2gray(image); 
    grModel = rgb2gray(model); 
    hImage = imhist(grImage); 
    hModel = imhist(grModel); 
    
    normhistInterMeasure = sum(min(hImage, hModel))/sum(hModel) 
    corrMeasure = corr2(hImage, hModel) 
    
  • Für Kreuzung und Korrelation ich 0,2492 und 0,9999 auf.