Initial commit with project files
This commit is contained in:
36
1_Grundlagen/ü3/README.md
Normal file
36
1_Grundlagen/ü3/README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
# Übung 3: Diskretisierung und Quantisierung
|
||||
|
||||
In dieser Übung wird die Quantisierung und Diskretisierung von Bildern betrachtet. In den folgenden Abbildungen sind beide
|
||||
Methoden visualisiert.
|
||||
|
||||
Quantisierung | Diskretisierung
|
||||
:---:|:---
|
||||
 | 
|
||||
[Link zum Bild](https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Quantized.signal.svg/2880px-Quantized.signal.svg.png) | [Link zum Bild](https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/Zeroorderhold.signal.svg/2880px-Zeroorderhold.signal.svg.png)
|
||||
|
||||
|
||||
## Aufgabe a) Diskretisierung
|
||||
In der Datei [a.py](a.py) wird ein Bild geladen. Das Bild hat die Größe 1526 x 1600 (Breite x Höhe).
|
||||
|
||||
Diskretisieren Sie das Bild mit dem Faktor *k* **ohne** und **mit** Verwendung der Funktion `cv2.resize()`. Dabei kann
|
||||
*k* die Werte 4, 8, und 13.5 annehmen. Zeigen Sie die Bilder für den direkten Vergleich an! Achten Sie dabei darauf,
|
||||
dass die Bilder in der gleichen Größe dargestellt werden.
|
||||
|
||||
|
||||
## Aufgabe b) Quantisierung
|
||||
In der Datei [b.py](b.py) wird ein Bild geladen. Das Bild ist im BGR-Farbraum repräsentiert und hat eine 8-Bit Quantisierung
|
||||
(Wertebereich {0, ..., 255}.
|
||||
|
||||
Führen Sie folgende Schritte durch:
|
||||
1. Quantisieren Sie das Bild in den Wertebereich {0, ..., 127}
|
||||
2. Quantisieren Sie das Bild aus Schritt 1 in den Wertebereich {0, ..., 3}
|
||||
3. Quantisieren Sie das Bild aus Schritt 2 zurück in den Wertebereich {0, ..., 255}
|
||||
|
||||
Zeigen Sie die Bilder aus allen Schritten für den direkten Vergleich an:
|
||||
|
||||
- Wie bewerten Sie die Qualität der Bilder?
|
||||
- Was fällt auf?
|
||||
|
||||
|
||||
|
||||
|
||||
22
1_Grundlagen/ü3/a.py
Normal file
22
1_Grundlagen/ü3/a.py
Normal file
@@ -0,0 +1,22 @@
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
# Hiermit kann die Methode für die Berechnung ausgewählt werden
|
||||
METHOD = "MANUELL" # OpenCV
|
||||
|
||||
# Einlesen des Bildes
|
||||
filepath = "../../data/flower.jpeg"
|
||||
img = cv2.imread(filepath)
|
||||
|
||||
h, w, c = img.shape
|
||||
print("Originale Breite:", w)
|
||||
print("Originale Höhe:", h)
|
||||
|
||||
scales = [4, 8, 13.5]
|
||||
images = []
|
||||
|
||||
# todo Methode MANUELL implementieren und 'images' mit diskretisierten Bildern füllen
|
||||
|
||||
# todo Methode OpenCV implementieren und 'images' mit diskretisierten Bildern füllen
|
||||
|
||||
# todo Bilder darstellen
|
||||
13
1_Grundlagen/ü3/b.py
Normal file
13
1_Grundlagen/ü3/b.py
Normal file
@@ -0,0 +1,13 @@
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
# Hiermit kann die Methode für die Berechnung ausgewählt werden
|
||||
METHOD = "MANUELL" # OpenCV
|
||||
|
||||
# Einlesen des Bildes
|
||||
filepath = "../../data/lena.png"
|
||||
img = cv2.imread(filepath)
|
||||
|
||||
h, w, c = img.shape
|
||||
|
||||
# todo Schritte 1-3 implementieren!
|
||||
46
1_Grundlagen/ü3/l_a.py
Normal file
46
1_Grundlagen/ü3/l_a.py
Normal file
@@ -0,0 +1,46 @@
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
# Hiermit kann die Methode für die Berechnung ausgewählt werden
|
||||
METHOD = "MANUELL" # OpenCV, MANUELL
|
||||
|
||||
# Einlesen des Bildes
|
||||
filepath = "../../data/flower.jpeg"
|
||||
img = cv2.imread(filepath)
|
||||
|
||||
h, w, c = img.shape
|
||||
print("Originale Breite:", w)
|
||||
print("Originale Höhe:", h)
|
||||
|
||||
scales = [4, 8, 13.5]
|
||||
images = []
|
||||
|
||||
for scale in scales:
|
||||
new_w, new_h = round(w / scale), round(h / scale)
|
||||
|
||||
if METHOD == "OpenCV":
|
||||
new_image = cv2.resize(img, (new_w, new_h))
|
||||
# Frage 1: Welche Interpolations-Methode wird hier verwendet?
|
||||
|
||||
elif METHOD == "MANUELL":
|
||||
new_image = np.zeros((new_h, new_w, c), dtype=np.uint8)
|
||||
for x in range(new_w):
|
||||
for y in range(new_h):
|
||||
x_projected, y_projected = min(w - 1, round(x * scale)), min(h - 1, round(y * scale))
|
||||
new_image[y, x] = img[y_projected, x_projected]
|
||||
# Frage 1: Welche Interpolations-Methode wird hier verwendet?
|
||||
# Frage 2: Welches Mapping wird hier verwendet (For- oder Backwardmapping)?
|
||||
|
||||
else:
|
||||
raise Exception("Da ist wohl ein Fehler unterlaufen!")
|
||||
|
||||
images.append(new_image)
|
||||
|
||||
# Bilder darstellen
|
||||
show_w, show_h = 1200, 1200
|
||||
img = cv2.resize(img, (show_w, show_h))
|
||||
cv2.imshow("Original", img)
|
||||
for scale, image in zip(scales, images):
|
||||
image = cv2.resize(image, (show_w, show_h))
|
||||
cv2.imshow("Scale %s" % scale, image)
|
||||
cv2.waitKey(0)
|
||||
36
1_Grundlagen/ü3/l_b.py
Normal file
36
1_Grundlagen/ü3/l_b.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import numpy as np
|
||||
import cv2
|
||||
|
||||
# Einlesen des Bildes
|
||||
filepath = "../../data/lena.png"
|
||||
img = cv2.imread(filepath)
|
||||
|
||||
'''
|
||||
Anwendung der Schritte:
|
||||
0. Für die Berechnung werden die Bilder in das kontinuierliche np.float64 konvertiert.
|
||||
1. In Wertebereich {0, ..., 127}
|
||||
2. In Wertebereich {0, ..., 3}
|
||||
3. In Wertebereich {0, ..., 255}
|
||||
'''
|
||||
|
||||
img_step0 = img.astype(np.float64)
|
||||
img_step1 = np.round(127 * np.copy(img_step0) / 255)
|
||||
img_step2 = np.round(3 * np.copy(img_step1) / 127)
|
||||
img_step3 = np.round(255 * np.copy(img_step2) / 3)
|
||||
|
||||
'''
|
||||
Für die Darstellung von np.float64 Bildern wird der Wertebereich von {0, ..., n_max} in [0, 1] projeziert.
|
||||
Dabei entspricht der Wert 1 dem ehemaligen Maximum n_max.
|
||||
'''
|
||||
|
||||
img_step0 = img_step0 / 255
|
||||
img_step1 = img_step1 / 127
|
||||
img_step2 = img_step2 / 3
|
||||
img_step3 = img_step3 / 255
|
||||
|
||||
cv2.imshow("Schritt 0", img_step0)
|
||||
cv2.imshow("Schritt 1", img_step1)
|
||||
cv2.imshow("Schritt 2", img_step2)
|
||||
cv2.imshow("Schritt 3", img_step3)
|
||||
|
||||
cv2.waitKey(0)
|
||||
Reference in New Issue
Block a user