Ich habe ein Problem, wie unten zu sehen ist das obere Bild ist das Originalbild, das auf der Unterseite ist nach links 90 Grad titelted. Gibt es eine Möglichkeit, die Winkeländerung zu berechnen? Ich habe Houghs Transformation versucht, ich kann den Ort erkennen, aber ich kann den Engel, der sich verändert hat, nicht erkennen. Gibt es eine Alternative, um den Grad zu erkennen?
Ich habe dies getan, bevor ich einen symmetrischen phasengleichen Filter verwendet habe. Es war eigentlich für die Erkennung von Fingerabdrücken, erlaubt Rotation und Skalierung. Leider ist es ziemlich kompliziert. Sie müssen sich damit auskennen, wie Sie eine FFT berechnen und mit ähnlichen mathematischen Methoden arbeiten können. Ich habe es nicht in C # gemacht, sondern in MATLAB (und im synthetisierbaren Verilog, aber das ist eine ganz andere Geschichte). Ich würde empfehlen, zuerst MATLAB oder ein ähnliches Mathe-Paket zu verwenden, um sicherzugehen, dass Sie den richtigen Algorithmus haben.
Hoffentlich hat jemand diesen Algorithmus bereits in einer .NET-Bildverarbeitungsbibliothek implementiert.
Das Papier, das ich verwendete, war das folgende. Es ist mehr mathematisch als algorithmisch, so dass es einige Arbeit in Anspruch nehmen wird, es in Code umzuwandeln:
Qin-Sheng Chen; Defrise, M .; Deconinck, F. "Nur symmetrische Phase abgestimmte Filterung von Fourier-Mellin transformiert für Bildregistrierung und Anerkennung, " Musteranalyse und Maschinelle Intelligenz, IEEE Transaktionen auf, Bd.16, Nr.12, pp.1156-1168, Dezember 1994
Zusammenfassung : Präsentiert eine neue Methode für ein 2D-Bild mit einem übersetzten gedrehtes und skaliertes Referenzbild Der Ansatz besteht aus zwei Schritten: die Berechnung eines Fourier-Mellins Invarianter (FMI) Deskriptor für jeden Bild zugeordnet werden, und die Übereinstimmung der FMI-Deskriptoren. Das FMI Der Deskriptor ist eine translationsinvariante, und stellt Rotation und Skalierung als dar Übersetzungen im Parameterraum. Das Übereinstimmung der FMI-Deskriptoren ist erreicht mit symmetrischen Phase-only angepasste Filterung (SPOMF). Das Leistung des FMI-SPOMF-Algorithmus ist das gleiche oder ähnlich dem von nur phasenangepasstes Filtern Umgang mit Bildübersetzungen. Das wesentlicher Vorteil des neuen Technik ist ihre Fähigkeit zu entsprechen gedreht und skaliert Bilder genau und effizient. Die Innovation ist das Anwendung von SPOMF auf das FMI Deskriptoren, die garantiert hoch diskriminierende Kraft und ausgezeichnet Robustheit in Gegenwart von Lärm. Dieser Artikel beschreibt das Prinzip von die neue Methode und ihre diskrete Implementierung für jedes Bild Erkennungsprobleme oder Bild Registrierungsprobleme. Praktisch Ergebnisse werden für verschiedene vorgestellt Anwendungen in der medizinischen Bildgebung, Fernerkundung, Fingerabdruck Erkennung und Multiobjekt Identifikation
Sie können auch das zweite Bild in einer Schleife um einen konstanten Winkel drehen und RMSE zwischen zwei Bildern in jeder Iteration berechnen. Der passende Winkel wird dort sein, wo RMSE minimal ist.
Hier ist Powershell Skript, das diese Idee mit ImageMagick :
%Vor% Ich hoffe, das hilft.
p.s.
Laut Wiki kann RMSE zwischen zwei Vektoren auf zwei verschiedene Arten berechnet werden. Ich weiß nicht, welches in ImageMagick als
# convert images to equal sizes for pixel by pixel comparision
convert.exe p1.png -resize 73x73! p1.png
convert.exe p2.png -resize 73x73! p2.png
# initialize variables
$min_rmse = 1.0
$degrees_rotated = -1.0
# rotate second image by 10 degrees in each iteration
# and after that measure RMSE between first image and second rotated image
for ($i=0; $i -le 350; $i+=10) {
convert.exe p2.png -rotate $i tmp.png
convert.exe tmp.png -resize 73x73! tmp.png
$rmse = compare.exe -metric rmse p1.png tmp.png diff.png 2>&1
$rmse = ([string] $rmse).split(" ")[1]
$rmse = $rmse.replace("(","")
$rmse = [double] $rmse.replace(")","")
# find rotation angle where RMSE is minimal
if ($rmse -lt $min_rmse) {
$min_rmse = $rmse
$degrees_rotated = $i
}
}
Write-Host "two images are most similar when second image is rotated by $degrees_rotated deg (rmse is $min_rmse)"
Write-Host "Press any key to exit ..."
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
-Befehl, aber sicher kann dies durch Fragen von IM-Entwicklern oder durch Trial-and-Error-Methode festgestellt werden.
Tags und Links c# image-processing