Initial commit with project files
This commit is contained in:
109
2_Bildbearbeitung/ü2/README.md
Normal file
109
2_Bildbearbeitung/ü2/README.md
Normal 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).
|
||||
BIN
2_Bildbearbeitung/ü2/data/cross1.png
Normal file
BIN
2_Bildbearbeitung/ü2/data/cross1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
2_Bildbearbeitung/ü2/data/cross2.png
Normal file
BIN
2_Bildbearbeitung/ü2/data/cross2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
BIN
2_Bildbearbeitung/ü2/data/edge_01.png
Normal file
BIN
2_Bildbearbeitung/ü2/data/edge_01.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.2 KiB |
BIN
2_Bildbearbeitung/ü2/data/edge_02.png
Normal file
BIN
2_Bildbearbeitung/ü2/data/edge_02.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 359 B |
50
2_Bildbearbeitung/ü2/l_a.py
Normal file
50
2_Bildbearbeitung/ü2/l_a.py
Normal 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()
|
||||
36
2_Bildbearbeitung/ü2/l_b.py
Normal file
36
2_Bildbearbeitung/ü2/l_b.py
Normal 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)
|
||||
Reference in New Issue
Block a user