S
Hallo,
vor ein paar Jahren hatte ich im Studium gelernt, wie man ein Bild projektiv entzerrt. D. h., man hat ein Objekt, das schräg in die Tiefe verweist (z. B. zum Fluchtpunkt) und nach der projektiven Entzerrung sieht man das Objekt frontal. Hier ein Beispiel.
Im Skript wird beschrieben, wie man die ursprünglichen Bildpunkte (x', y') nach (x, y) umbildet. Dabei wird eine Formel, die ursprünglich als Bruch vorliegt, in eine lineare Gleichung umgewandelt, damit man diese dann lösen kann (Pseudoinverse berechnen oder die Methode der kleinsten Quadrate).
Soweit, so gut. Ich habe damals in einem Python-Skript die Pseudo-Inverse berechnet, um an die Unbekanten (a1, a2, a3, b1, b2, b3, c1, c2) zu kommen und dann habe ich folgendes gemacht, um (x' y') nach (x, y) umzubilden:
# Berechnung der Unbekannten a.
a1 = a[0]
a2 = a[1]
a3 = a[2]
b1 = a[3]
b2 = a[4]
b3 = a[5]
c1 = a[6]
c2 = a[7]
for y in np.arange(0, new_image.shape[0]):
for x in np.arange(0, new_image.shape[1]):
denominator = ((b1 * c2 - b2 * c1) * x) + ((a2 * c1 - a1 * c2) * y) + (a1 * b2) - (a2 * b1)
new_x = ((b2 - c2 * b3) * x + (a3 * c2 - a2) * y + a2 * b3 - a3 * b2) / denominator
new_y = ((b3 * c1 - b1) * x + (a1 - a3 * c1) * y + a3 * b1 - a1 * b3) / denominator
if new_x > 0 and new_y > 0 and new_x < image_orig.shape[1] and new_y < image_orig.shape[0]:
new_image[y, x, :] = image_orig[new_y, new_x, :]
return new_image
Mir ist die Formel, die für new_y und new_y angewendet wird, absolut unverständlich, obwohl ich das damals umgesetzt habe. Meiner Ansicht nach hätte ich einfach die neuen Koordinaten (x, y) in Matrixschreibweise berechnen können (Seite 2) oder als Bruch wie in Seite 1.
Aber was habe ich da gemacht? Vor allem: Es hat funktioniert. Das sehe ich an den Resultaten.
Kann mich da einer aufklären?
Danke im Voraus!
Steffo