Skip to content
Snippets Groups Projects
Commit aaf1aa2f authored by Tamino Huxohl's avatar Tamino Huxohl
Browse files

update and implement rotation task

parent 970df4ff
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Aufgabe
## Teil 1
In dieser Aufgabe geht es darum Bilder um Ihren Mittelpunkt entgegen dem Uhrzeigersinn zu rotieren.
Beantworten Sie dafür die mit `#TODO` gekennzeichneten Fragen und implementieren Sie die mit `#TODO` gekennzeichneten Codestellen.
Beachten Sie ggf. die Hinweise unten.
Beschreiben Sie die Schritte um ein Bild im Bildmittelpunkt um den Winkel $\alpha$ entgegen dem Uhrzeigersinn zu drehen. Die Rotation eines Punktes $\begin{pmatrix} j \\ k \end{pmatrix}$ um den Winkel $\alpha$ ergibt sich mittels der Rotationsmatrix wie folgt:
Die Rotation eines Punktes $\begin{pmatrix} j \\ k \end{pmatrix}$ um den Winkel $\alpha$ ergibt sich mittels der Rotationsmatrix wie folgt:
$$\begin{pmatrix} j' \\ k' \end{pmatrix} = \begin{pmatrix} \cos \alpha & \sin \alpha \\ -\sin \alpha & \cos \alpha \end{pmatrix} \begin{pmatrix} j \\ k \end{pmatrix}$$
(Tipp: Gehen Sie so ähnlich wie bei der Größennormierung vor. Was passiert mit Punkten die nach der Rotation außerhalb des neuen Bildes liegen?)
1. Was für Besonderheiten gibt es bei der Rotation von Bildern im Gegensatz zur Größennormierung und wie kann man damit umgehen?
## Teil 2
`#TODO`
Implementieren Sie den von Ihnen zuvor entwickelten Algorithmus zur Rotation eines Bildes um einen beliebigen Winkel im Bildmittelpunkt. Verwenden Sie nicht die Rotationsfunktion aus OpenCV.
2. Implementieren Sie einen Algorithmus für die Rotation eines Bildes um dessen Mittelpunkt an der mit `#TODO` gekennzeichneten Codestelle. Beachten Sie dabei, dass der Winkel als Bogenmaß übergeben wird und dass es sich bei dem Bild um ein Grauwertbild handelt.
# TODO:
%% Cell type:code id: tags:
Das ist so die alte Struktur. Das macht denke ich eher Sinn, wenn das getrennte Aufgaben sind und man zur Theorie erst Feedback bekommt. Das sollte besser zu nur dem zweiten praktischen Teil umformuliert werden.
``` python
import math
import os
import random
import cv2 as cv
import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt
def rotate(img, alpha):
# Der Typ der Bilder wird hier geändert um Overflows zu vermeiden (siehe Beispiele)
img = img.astype(np.float)
result = np.zeros((img.shape[:2]), np.float)
#TODO implementieren Sie dir Rotation
return result.astype(np.uint8)
def degree_to_radians(degree):
return math.pi * degree / 180
dir_resources = '../resources'
img = cv.imread(os.path.join(dir_resources, 'Uniansicht.jpg'), cv.IMREAD_GRAYSCALE)
random_degree = random.randint(1, 359)
fig, axs = plt.subplots(2, 2, figsize = (12, 9))
_ = axs[0, 0].imshow(img, cmap='gray')
_ = axs[0, 0].set_title('Uniansicht')
_ = axs[0, 1].imshow(rotate(img, degree_to_radians(90)), cmap='gray')
_ = axs[0, 1].set_title('Uniansicht 90°')
_ = axs[1, 0].imshow(rotate(img, degree_to_radians(180)), cmap='gray')
_ = axs[1, 0].set_title('Uniansicht 180°')
_ = axs[1, 1].imshow(rotate(img, random_degree), cmap='gray')
_ = axs[1, 1].set_title(f'Uniansicht {random_degree}°')
```
%% Output
%% Cell type:markdown id: tags:
#### Hinweise:
* Gehen Sie wie bei der Größennormierung vor. Projezieren Sie die Ganzzahligen Pixel des Ergebnisbildes in das Ursprungsbild und berechnen Sie die Pixelintensität über bilineare Interpolation.
* Können Pixel nach der Pojektion in die Koordinaten des Ursprungsbildes außerhalb des Bildes liegen?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment