Initial commit with project files

This commit is contained in:
2025-06-27 14:34:11 +02:00
commit 7ea3207e63
310 changed files with 9331 additions and 0 deletions

View File

@@ -0,0 +1,109 @@
# Übung 2: Lokale Bildoperationen
Lokale Bildoperationen berechnen den Pixelwert des Ausgangspixels aus der lokalen Umgebung des Eingangspixels. Die
Berechnungsvorschrift ist dabei für jedes Pixel gleich.
In dieser Übung werden einige Beispiele für lokale Bildoperationen behandelt. Dabei werden unter anderem
- Faltung
- Gradienten
- Rangfolgefilter
- Hochpass, Tiefpass, Bandpass
verwendet.
## Aufgabe a)
Das Bild zeigt ***I_in*** zwei sich schneidende Linien (eine horizontalen und eine vertikale) auf hellem
Hintergrund (außerhalb des eingezeichneten Rasters sind die Flächen wie angedeutet störungsfrei
fortgeführt). Es soll nun die Horizontale extrahiert und in binärer Form dargestellt werden, so dass
sich das Binärbild ***I_out*** ergibt. Im folgenden sind
die Bilder visualisiert und als Matrix dargestellt.
<p align="center">
<img src="./data/cross1.png" />
</p>
```python
I_in = [
[200, 200, 100, 200, 200],
[200, 200, 100, 200, 200],
[100, 100, 100, 100, 100],
[200, 200, 100, 200, 200],
[200, 200, 100, 200, 200],
]
```
<p align="center">
<img src="./data/cross2.png" />
</p>
```python
I_out = [
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[255, 255, 255, 255, 255],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
]
```
Für die Aufgabe stehen die folgenden Operationen zur Verfügung:
- Hochpassfilter mit 3x3 Faltungskern
```python
[
[ -1, -1, -1 ],
[ -1, 8, -1 ],
[ -1, -1, -1 ]
]
```
- Kantenfilter mit 3x3 Faltungskern
```python
[
[ 1, 0, -1 ],
[ 1, 0, -1 ],
[ 1, 0, -1 ]
]
```
- Kantenfilter mit 3x3 Faltungskern
```python
[
[ -1, -1, -1 ],
[ 0, 0, 0 ],
[ 1, 1, 1 ]
]
```
- Punktoperation: Betragsbildung
- Punktoperation: Schwellwertoperation, Punkte mit einer Intensität *I_xy* < 128 werden auf *I_xy* = 0 gesetzt, ansonsten zu 255
- Median-Filter der Größe 3x3
Wählen Sie 4 der 6 Operationen und wenden Sie sie auf die das Bild an. Jede Operation darf dabei nur einmal verwendet werden.
Visualisieren Sie jeden Zwischenschritt.
Die Aufgabe soll in der Datei [a.py](a.py) bearbeitet werden! Die entsprechende Lösung finden Sie in [l_a.py](l_a.py).
**Hinweis:** Mehrere Lösungswege sind möglich!
## Aufgabe b)
Gegeben ist das Bild [edge_01.png](data/edge_01.png). Es zeigt zwei aneinander grenzende graue Flächen die mit Rauschen
versetzt sind. Ziel ist es, das Bild so zu filtern, dass die Kante als weichgezeichnete Linie auf
schwarzem Untergrund resultiert, wie in Bild [edge_02.png](data/edge_02.png) beispielhaft dargestellt ist.
*edge_01.png*:
<p align="center">
<img src="./data/edge_01.png" />
</p>
*edge_02.png*:
<p align="center">
<img src="./data/edge_02.png" />
</p>
Für die Bearbeitung können Sie sich verschiedener Filter bedienen. Beispiele dafür können sein
- Hochpass, Tiefpass, Bandpass
- Diverse Richtungsfilter
- Rangfolgefilter wie Minimum, Maximum, Median
Die Aufgabe soll in der Datei [b.py](b.py) bearbeitet werden! Die entsprechende Lösung finden Sie in [l_b.py](l_b.py).

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 359 B

View File

@@ -0,0 +1,50 @@
import numpy as np
import cv2
''' Einlesen des Bildes '''
I_in = [
[200, 200, 100, 200, 200],
[200, 200, 100, 200, 200],
[100, 100, 100, 100, 100],
[200, 200, 100, 200, 200],
[200, 200, 100, 200, 200],
]
I_in = np.asarray(I_in, dtype="uint8")
print("Bild vor der Bearbeitung:")
print(I_in)
print()
print(I_in.dtype)
''' Operation 1: Kantenfilter '''
edge = [
[-1, -1, -1],
[ 0, 0, 0],
[ 1, 1, 1]
]
edge = np.asarray(edge)
edge_conv = np.flip(edge)
I_in = cv2.filter2D(I_in, cv2.CV_64F, edge_conv, borderType=cv2.BORDER_REPLICATE)
print("Operation 1: Kantenfilter")
print(I_in)
print()
''' Operation 2: Absolutwertbildung '''
I_in = np.abs(I_in)
print("Operation 2: Absolutwertbildung")
print(I_in)
print()
''' Operation 3: Medianfilter'''
I_in = cv2.medianBlur(I_in.astype("float32"), 3)
print("Operation 3: Medianfilter")
print(I_in)
print()
''' Operation 4: Schwellwert '''
I_in = np.copy(I_in)
ret, I_out = cv2.threshold(I_in, 127, 255, cv2.THRESH_BINARY)
print("Operation 4: Schwellwert")
print(I_out)
print()

View File

@@ -0,0 +1,36 @@
import numpy as np
import cv2
''' Einlesen des Bildes '''
I_in = cv2.imread("data/edge_01.png")
I_in = cv2.cvtColor(I_in, cv2.COLOR_BGR2GRAY)
cv2.imshow("Bild Schritt 0", I_in)
''' Operation 1: Median-Filter'''
I_in = cv2.medianBlur(I_in, 9)
cv2.imshow("Bild Schritt 1", I_in)
''' Operation 2: Kantenfilter'''
edge = [
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]
]
edge = np.asarray(edge)
I_in = cv2.filter2D(I_in, cv2.CV_64F, edge, borderType=cv2.BORDER_REPLICATE)
cv2.imshow("Bild Schritt 2", I_in)
''' Operation 3: Glättung / Tiefpass mit Boxfilter'''
edge = [
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]
]
edge = np.asarray(edge) / 9
I_in = cv2.filter2D(I_in, cv2.CV_64F, edge, borderType=cv2.BORDER_REPLICATE)
I_in = I_in / np.max(I_in)
cv2.imshow("Bild Schritt 3", I_in)
''' Bilder anzeigen, Bis Taste gedrückt wird '''
cv2.waitKey(0)