Der Ahead-Mapping-Prozess besteht aus dem einfachen Bildtransformationsprozess, der in der Einleitung und im vorherigen Artikel besprochen wurde: Er iteriert über alle Pixel des Bildes und die entsprechende Transformation wird auf jedes Pixel einzeln angewendet. Allerdings müssen die Fälle berücksichtigt werden, in denen die neue Place des transformierten Pixels außerhalb des Bildbereichs liegt, wofür unten ein Beispiel gezeigt wird.
Um den Vorwärtsmapping-Prozess durchzuführen, definieren Sie zunächst eine Funktion, die als Parameter die Originalkoordinaten eines Pixels empfängt. Diese Funktion wendet eine Transformation auf die ursprünglichen Pixelkoordinaten an und gibt nach der Transformation die neuen Koordinaten des Pixels zurück. Das folgende Codebeispiel zeigt die Funktion für die Rotationstransformation.
def apply_transformation(original_x: int, original_y: int) -> Tuple[int, int]:
# Outline the rotation matrix
rotate_transformation = np.array([[np.cos(np.pi/4), -np.sin(np.pi/4), 0],
[np.sin(np.pi/4), np.cos(np.pi/4), 0],
[0, 0, 1]])
# Apply transformation after setting homogenous coordinate to 1 for the unique vector.
new_coordinates = rotate_transformation @ np.array([original_x, original_y, 1]).T
# Spherical the brand new coordinates to the closest pixel
return int(np.rint(new_coordinates[0])), int(np.rint(new_coordinates[1]))
Sobald Sie über diese Funktion verfügen, müssen Sie nur noch jedes Pixel des Bildes durchlaufen, die Transformation anwenden und prüfen, ob die neuen Pixelkoordinaten im Bereich des Originalbilds liegen. Wenn die neuen Koordinaten innerhalb der Domäne liegen, nimmt das Pixel an den neuen Koordinaten des neuen Bildes den Wert an, den das ursprüngliche Pixel im Originalbild hatte. Wenn es außerhalb des Bildes liegt, wird das Pixel weggelassen.
def forward_mapping(original_image: np.ndarray) -> np.ndarray:
# Create the brand new picture with identical form as the unique one
new_image = np.zeros_like(original_image)
for original_y in vary(original_image.form[1]):
for original_x in vary(original_image.form[0]):
# Apply rotation on the unique pixel's coordinates
new_x, new_y = apply_transformation(original_x, original_y)
# Verify if new coordinates fall contained in the picture's area
if 0 <= new_y < new_image.form[1] and 0 <= new_x < new_image.form[0]:
new_image[new_x, new_y, :] = original_image[original_x, original_y, :]return new_image
Das Ergebnis der Anwendung einer Rotationstransformation mit Vorwärtszuordnung ist im Bild unten zu sehen, wobei hyperlinks das Originalbild und rechts das transformierte Bild ist. Es ist wichtig zu beachten, dass bei diesem Bild der Koordinatenursprung in der oberen linken Ecke liegt, sodass sich das Bild um diesen Punkt gegen den Uhrzeigersinn dreht.
Was das Ergebnis der Transformation betrifft, so ist zu erkennen, dass das transformierte Bild nicht den vollständig schwarzen Hintergrund wie das Unique, sondern viele weiße Streifen aufweist. Dies geschieht, wie in der Einleitung erwähnt, weil die Pixel des Originalbilds nicht immer allen Pixeln des neuen Bilds zugeordnet werden können. Da die neuen Koordinaten durch Aufrunden auf das nächste Pixel berechnet werden, führt dies dazu, dass viele Zwischenpixel nie einen Wert erhalten. Da in diesem Fall das neue Bild mit leeren Pixeln initialisiert wird, bleiben die Pixel, denen während der Transformation kein Wert zugewiesen wurde, leer, wodurch diese weißen Streifen im transformierten Bild entstehen.
Darüber hinaus ist zu beachten, dass es ein weiteres bemerkenswertes Drawback gibt: Überschneidungen. Dieses Drawback tritt auf, wenn zwei Pixel des Originalbilds in dieselben Pixel des neuen Bilds umgewandelt werden. Wenn für den in diesem Artikel verwendeten Code zwei Pixel des Originalbilds vorhanden sind, die demselben Pixel des neuen Bilds zugeordnet sind, nimmt das neue Pixel den Wert des letzten Originalpixels an, das transformiert wurde, und überschreibt den Wert des erste, die bereits eingestellt struggle.