Es gibt nur wenige japanische Artikel zur Bildausrichtung (Stand: 22. Januar 2020), daher fand ich es sehr einfach zu verstehen Bildregistrierung: Von SIFT zu Deep Learning -07-16-Bildregistrierung-Deep-Learning) wurde übersetzt oder zusammengefasst. Einige Teile wurden weggelassen oder hinzugefügt. Wenn Sie also auf den Originaltext verweisen möchten, lesen Sie bitte den Originalartikel.
Bei der Bildausrichtung wird die Fehlausrichtung zweier Bilder korrigiert. Die Bildausrichtung wird verwendet, wenn mehrere Bilder in derselben Szene verglichen werden. Beispielsweise tritt es häufig in den Bereichen Satellitenbildanalyse, optischer Fluss und medizinische Bilder auf. Schauen wir uns ein konkretes Beispiel an. Das Bild oben ist eine Ausrichtung des Bildes des Muscat Bonbon, den ich in Shin-Okubo gegessen habe. Es war sehr lecker, aber ich würde es keinem empfehlen, der kein süßer Zahn ist. In diesem Beispiel können Sie sehen, dass die Position des zweiten Muscat-Bonbons von links mit der Position des Muscat-Bonbons ganz links ausgerichtet ist, während die Helligkeit usw. beibehalten wird. Im Folgenden wird das Bild, auf das ohne Konvertierung verwiesen wird, wie z. B. das linke Ende, als Referenzbild bezeichnet, und das Bild, das konvertiert wird, z. B. das zweite von links, wird als schwebendes Bild bezeichnet. Dieser Artikel beschreibt einige Techniken zum Ausrichten zwischen schwebenden Bildern und Referenzbildern. Beachten Sie, dass die auf Iteration / Signalstärke basierende Methode nicht sehr verbreitet ist und in diesem Artikel nicht erwähnt wird.
Seit den frühen 2000er Jahren werden merkmalsbasierte Ansätze zur Bildausrichtung verwendet. Dieser Ansatz besteht aus drei Schritten: Schlüsselpunkterkennung und Merkmalsbeschreibung, Merkmalsanpassung und Bildtransformation. Einfach ausgedrückt, wählen Sie die interessierenden Punkte in beiden Bildern aus, ordnen Sie jeden interessierenden Punkt im Referenzbild dem entsprechenden Punkt im schwebenden Bild zu und transformieren Sie das schwebende Bild so, dass beide Bilder ausgerichtet sind.
Wichtige Punkte definieren wichtige und charakteristische Dinge im Bild (wie Ecken und Kanten). Jeder Schlüsselpunkt wird durch einen Deskriptor dargestellt. Ein Deskriptor ist ein Merkmalsvektor, der die wesentlichen Merkmale eines Schlüsselpunkts enthält. Der Deskriptor muss gegenüber Bildtransformationen (Lokalisierung, Skalierung, Helligkeit usw.) robust sein. Es gibt viele Algorithmen zum Erkennen von Schlüsselpunkten und zum Beschreiben von Merkmalen.
Diese Algorithmen sind mit OpenCV einfach zu verwenden. Im folgenden Beispiel haben wir die OpenCV-Implementierung von AKAZE verwendet. Sie können andere Algorithmen verwenden, indem Sie den Algorithmus einfach umbenennen.
import cv2 as cv
#Importieren Sie Bilder in Graustufen, damit wichtige Punkte besser sichtbar sind
img = cv.imread('img/float.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
#Schlüsselpunkterkennung und Funktionsbeschreibung
akaze = cv.AKAZE_create()
kp, descriptor = akaze.detectAndCompute(gray, None)
keypoints_img = cv.drawKeypoints(gray, kp, img)
cv.imwrite('keypoints.jpg', keypoints_img)
Weitere Informationen zur Funktionserkennung und zu Deskriptoren finden Sie im OpenCV-Lernprogramm (https://docs.opencv.org/3.4/d7/d66/tutorial_feature_detection.html).
Nachdem Sie die Schlüsselpunkte in beiden Bildern gefunden haben, müssen Sie die entsprechenden Schlüsselpunkte zuordnen oder "abgleichen". Eine der Methoden dafür ist "BFMatcher.knnMatch ()". Es misst den Abstand zwischen jedem Paar von Schlüsselpunktdeskriptoren und stimmt mit k Schlüsselpunkten vom nächstgelegenen zu jedem Schlüsselpunkt überein. Wenden Sie dann einen Verhältnisfilter an, um nur die richtigen Übereinstimmungen beizubehalten. Für eine zuverlässige Übereinstimmung müssen die übereinstimmenden Schlüsselpunkte deutlich näher als die nächste falsche Übereinstimmung liegen.
import cv2 as cv
float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)
akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)
#Feature Matching
bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)
#Behalten Sie nur die richtige Übereinstimmung bei
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append([m])
matches_img = cv.drawMatchesKnn(
float_img,
float_kp,
ref_img,
ref_kp,
good_matches,
None,
flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv.imwrite('matches.jpg', matches_img)
Weitere in OpenCV implementierte Feature-Matching-Methoden finden Sie in der Dokumentation (https://docs.opencv.org/trunk/dc/dc3/tutorial_py_matcher.html).
Konvertieren Sie ein Bild relativ zum anderen, nachdem Sie mindestens 4 Sätze von Schlüsselpunkten abgeglichen haben. Dies wird als [Image Warping] bezeichnet (https://docs.opencv.org/3.0-beta/modules/cudawarping/doc/warping.html). Homografie (https://docs.opencv.org/3.4.1/d9/dab/tutorial_homography.html) verknüpft zwei Bilder auf derselben Ebene im Raum. Homographie ist eine geometrische Transformation, die acht freie Parameter hat und durch eine 3x3-Matrix dargestellt wird. Sie stellen die Verzerrung dar, die auf das gesamte Bild angewendet wird (im Gegensatz zu lokalen Transformationen). Um das transformierte schwebende Bild zu erhalten, berechnen Sie daher die Homografiematrix und wenden Sie sie auf das schwebende Bild an. Um eine optimale Konvertierung sicherzustellen, wird der Algorithmus RANSAC verwendet, um Ausreißer zu erkennen und zu entfernen, um die endgültige Homographie zu bestimmen. Ich werde. Es ist direkt in die OpenCV-Methode findHomography (https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html?highlight=findhomography#findhomography) integriert. Als Alternative zu RANSAC LMEDS: Es gibt auch eine Methode zur robusten Schätzung wie die Minimal-Median-Methode.
import numpy as np
import cv2 as cv
float_img = cv.imread('img/float.jpg', cv.IMREAD_GRAYSCALE)
ref_img = cv.imread('img/ref.jpg', cv.IMREAD_GRAYSCALE)
akaze = cv.AKAZE_create()
float_kp, float_des = akaze.detectAndCompute(float_img, None)
ref_kp, ref_des = akaze.detectAndCompute(ref_img, None)
bf = cv.BFMatcher()
matches = bf.knnMatch(float_des, ref_des, k=2)
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append([m])
#Wählen Sie den richtigen Schlüsselpunkt
ref_matched_kpts = np.float32(
[float_kp[m[0].queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
sensed_matched_kpts = np.float32(
[ref_kp[m[0].trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
#Homographie berechnen
H, status = cv.findHomography(
ref_matched_kpts, sensed_matched_kpts, cv.RANSAC, 5.0)
#Bild konvertieren
warped_image = cv.warpPerspective(
float_img, H, (float_img.shape[1], float_img.shape[0]))
cv.imwrite('warped.jpg', warped_image)
Wenn Sie an den Details dieser drei Schritte interessiert sind, hat OpenCV eine Reihe nützlicher Tutorials zusammengestellt (https://docs.opencv.org/3.1.0/db/d27/tutorial_py_table_of_contents_feature2d.html).
In den jüngsten Studien zur Bildausrichtung ging es um die Verwendung von Deep Learning. In den letzten Jahren hat Deep Learning eine Spitzenleistung bei Computer-Vision-Aufgaben wie Klassifizierung, Erkennung und Segmentierung ermöglicht. Die Bildausrichtung ist keine Ausnahme.
Deep Learning wurde zuerst für die Bildausrichtung zur Merkmalsextraktion verwendet. Eine kontinuierliche Schicht von Faltungs-Neuronalen Netzen (CNNs) erfasst immer komplexere Bildmerkmale und lernt aufgabenspezifische Merkmale. Seit 2014 wenden Forscher diese Netzwerke eher auf Extraktionsschritte als auf SIFT oder ähnliche Algorithmen an.
Forscher haben versucht, eine Ausrichtung zu erreichen, indem sie geometrische Transformationen mithilfe neuronaler Netze direkt lernen, anstatt die Verwendung von Deep Learning auf die Merkmalsextraktion zu beschränken.
Im Jahr 2016 erklärten DeTone et al. Ein Regressionshomografienetz, ein Modell im VGG-Stil, das die Homografie von zwei Bildern lernt Deep Image Homography Estimation. pdf) wurde veröffentlicht. Dieser Algorithmus hat den Vorteil, dass Homographie- und CNN-Modellparameter gleichzeitig durchgehend gelernt werden. Es ist kein Feature-Extraktions- und Matching-Prozess erforderlich.
Das Netzwerk erzeugt acht reelle Zahlen als Ausgabe. Überwachtes Lernen erfolgt durch den Verlust zwischen der Ausgabe und der Grundwahrheitshomographie.
Wie andere überwachte Lernansätze erfordert diese Homographieschätzmethode ein Paar überwachter Daten. Es ist jedoch nicht einfach, eine großartige Wahrheitshomographie mit tatsächlichen Daten zu erhalten.
Nguyen et al. Präsentierten einen unbeaufsichtigten Lernansatz zur Schätzung der Tiefenbildhomographie. Sie verwendeten das gleiche CNN, mussten jedoch eine Verlustfunktion verwenden, die für den unbeaufsichtigten Ansatz geeignet war. Deshalb haben wir uns für den photometrischen Verlust entschieden, für den kein großes Wahrheitsetikett erforderlich ist. Berechnet die Ähnlichkeit zwischen dem Referenzbild und dem konvertierten schwebenden Bild.
Ihr Ansatz führt zwei neue Netzwerkstrukturen ein, die Tensor Direct Linear Transform und die Spatial Transformation Layer.
Die Autoren argumentieren, dass diese unbeaufsichtigte Methode im Vergleich zu herkömmlichen merkmalsbasierten Methoden eine schnellere Inferenzgeschwindigkeit, eine vergleichbare oder bessere Genauigkeit und Robustheit gegenüber Lichtschwankungen aufweist. Darüber hinaus ist es anpassungsfähiger und leistungsfähiger als die überwachte Methode.
Tiefes Lernen zur Verstärkung zieht die Aufmerksamkeit auf sich, um medizinische Anwendungen aufeinander abzustimmen. Im Gegensatz zu den vordefinierten Optimierungsalgorithmen werden bei diesem Ansatz geschulte Agenten verwendet, um die Ausrichtung durchzuführen.
Aktuelle Forschungen zu einem signifikanten Anteil der Bildausrichtung sind auf dem Gebiet der medizinischen Bildgebung relevant. In vielen Fällen kann die Transformation zwischen zwei medizinischen Bildern aufgrund der lokalen Transformationen des Subjekts (wie Atmung und anatomische Veränderungen) nicht einfach durch eine Homographiematrix beschrieben werden. Wir brauchen komplexere Transformationsmodelle, wie z. B. differentielle In-Phase-Mappings, die durch Verschiebungsvektorfelder dargestellt werden können.
Forscher haben versucht, diese großen Transformationsmodelle mit vielen Parametern unter Verwendung neuronaler Netze abzuschätzen.
--Quicksilver Alignment (https://www.researchgate.net/publication/315748621_Quicksilver_Fast_Predictive_Image_Registration_-_a_Deep_Learning_Approach) behebt ein ähnliches Problem. Quicksilver verwendet ein tiefgreifendes Codierungs- / Decodierungsnetzwerk, um Patch-für-Patch-Konvertierungen im Erscheinungsbild von Bildern direkt vorherzusagen.
Ich habe einige Techniken zur Bildausrichtung eingeführt. Es wurde festgestellt, dass sich die Methode zur Verwendung von Merkmalspunkten zur Methode der direkten Konvertierung von Bildern durch tiefes Lernen ändert.
Recommended Posts