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.
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).
[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:

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:

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!
Sie benötigen eine logarithmisch-polare comparaison verwenden ... keine Ahnung, ob es bereits in Matlab oder in einer Matlab Toolbox implementiert ist ... – Alexxx
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
Dies könnte Ihnen einige Ideen geben: [Algorithmusverbesserung für Coca-Cola kann die Erkennung formen] (http://stackoverflow.com/q/10168686/2545927) – kkuilla