Initial commit with project files
This commit is contained in:
40
3_Signalorientierte_Bildverarbeitung/ü3/README.md
Normal file
40
3_Signalorientierte_Bildverarbeitung/ü3/README.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# Übung 3: Fouriertransformation
|
||||
|
||||
In dieser Übung soll die Fouriertransformation betrachtet werden.
|
||||
|
||||
## Aufgabe a) Rauschen im Orts- und Frequenzbereich
|
||||
Um den Umgang mit Orts- und Frequenzbereich in Python zu verdeutlichen und die Grundlage
|
||||
für die Folgeaufgaben zu stellen, soll ein Programm geschrieben werden, das die folgenden Schritte
|
||||
durchführt:
|
||||
|
||||
1. Öffnen Sie das Skript [a.py](a.py)
|
||||
2. Transformieren Sie die Bilder *img* und *img_noise* mit ``np.fft.fft2(img)`` in den Frequenzbereich.
|
||||
3. Berechnen Sie den Betrag/Amplitude der Transformierten und stellen Sie diese als Bild dar.
|
||||
4. Worin unterscheiden sich die Bilder?
|
||||
|
||||
Die Musterlösung befindet sich in der Datei [l_a.py](l_a.py).
|
||||
|
||||
**Hinweise:**
|
||||
- Mit der Funktion ``np.fft.fftshift(IMAGE)`` wird der Gleichanteil des Frequenzbereiches in die Mitte
|
||||
des Bildes gelegt.
|
||||
- Zur besseren Visualisierung des Frequenzbereiches ist es empfehlenswert, die anzuzeigenden Werte mit einem Faktor
|
||||
zu reduzieren. Das kann z.B. ``magnitudes = magnitudes / 100000`` sein.
|
||||
|
||||
## Aufgabe b) Amplituden und Phasenspektrum vertauschen
|
||||
|
||||
In der Datei [b.py](b.py) werden zwei Bilder geladen. Transformieren Sie sie in den Frequenzbereich und tauschen Sie die
|
||||
Winkel und Amplituden. Stellen Sie die Bilder vor und nach dem Tausch dar!
|
||||
|
||||
Die Musterlösung befindet sich in der Datei [l_b.py](l_b.py).
|
||||
|
||||
## Aufgabe c) Tiefpassfilter
|
||||
|
||||
In der Datei [c.py](c.py) wird ein Bild eines Teppichs geladen. Der Teppich hat Fehler in den Maschen, die Sie finden möchten.
|
||||
Um die Fehler besser finden zu können, möchten Sie das Bild mithilfe der Fourier-Transformation optisch anpassen.
|
||||
|
||||
Transformieren Sie das Bild in den Frequenzbereich und löschen Sie verschiedene hochfrequente und/oder niederfrequente Anteile.
|
||||
Transformieren Sie das Spektrum darauf wieder in den Ortsbereich und stellen die Bilder dar!
|
||||
|
||||
Welche Frequenzen scheinen für die Aufgabe interessanter zu sein?
|
||||
|
||||
Die Musterlösung befindet sich in der Datei [l_c.py](l_c.py).
|
||||
20
3_Signalorientierte_Bildverarbeitung/ü3/a.py
Normal file
20
3_Signalorientierte_Bildverarbeitung/ü3/a.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
img = cv2.imread("../../data/lena.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
''' Rauschen hinzufügen '''
|
||||
h, w = img.shape
|
||||
saltpepper_noise = np.zeros((h, w), dtype=np.uint8)
|
||||
saltpepper_noise = cv2.randu(saltpepper_noise, 0, 255)
|
||||
black = saltpepper_noise < 15
|
||||
white = saltpepper_noise > 240
|
||||
img_noise = np.copy(img)
|
||||
img_noise[white] = 255
|
||||
img_noise[black] = 0
|
||||
|
||||
|
||||
''' Bild anzeigen '''
|
||||
cv2.imshow("img", img)
|
||||
cv2.imshow("img_noise", img_noise)
|
||||
cv2. waitKey()
|
||||
10
3_Signalorientierte_Bildverarbeitung/ü3/b.py
Normal file
10
3_Signalorientierte_Bildverarbeitung/ü3/b.py
Normal file
@@ -0,0 +1,10 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
car = cv2.imread("../../data/car.png", cv2.IMREAD_GRAYSCALE)
|
||||
dog = cv2.imread("../../data/dog.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
cv2.imshow("car", car)
|
||||
cv2.imshow("dog", dog)
|
||||
|
||||
cv2. waitKey()
|
||||
24
3_Signalorientierte_Bildverarbeitung/ü3/c.py
Normal file
24
3_Signalorientierte_Bildverarbeitung/ü3/c.py
Normal file
@@ -0,0 +1,24 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
img = cv2.imread("../../data/teppich.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
|
||||
''' FFT '''
|
||||
IMG = np.fft.fft2(img)
|
||||
MAGNITUDE = np.abs(IMG)
|
||||
ANGLE = np.angle(IMG)
|
||||
|
||||
''' Filter out frequencies '''
|
||||
|
||||
|
||||
|
||||
''' IFFT '''
|
||||
IMG = MAGNITUDE * np.exp(1j * ANGLE)
|
||||
filtered_image = np.fft.ifft2(IMG).astype(np.float32)
|
||||
|
||||
''' Bild anzeigen '''
|
||||
cv2.imshow("img", img)
|
||||
cv2.imshow("filtered", filtered_image / np.max(filtered_image))
|
||||
|
||||
cv2.waitKey(0)
|
||||
29
3_Signalorientierte_Bildverarbeitung/ü3/l_a.py
Normal file
29
3_Signalorientierte_Bildverarbeitung/ü3/l_a.py
Normal file
@@ -0,0 +1,29 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
img = cv2.imread("../../data/lena.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
''' Rauschen hinzufügen '''
|
||||
h, w = img.shape
|
||||
saltpepper_noise = np.zeros((h, w), dtype=np.uint8)
|
||||
saltpepper_noise = cv2.randu(saltpepper_noise, 0, 255)
|
||||
black = saltpepper_noise < 15
|
||||
white = saltpepper_noise > 240
|
||||
img_noise = np.copy(img)
|
||||
img_noise[white] = 255
|
||||
img_noise[black] = 0
|
||||
|
||||
''' FFT '''
|
||||
visual_factor = 100000
|
||||
IMG = np.fft.fftshift(np.fft.fft2(img))
|
||||
IMG_magnitude = np.abs(IMG)
|
||||
cv2.imshow("IMG_magnitude", IMG_magnitude / visual_factor)
|
||||
|
||||
IMG_NOISE = np.fft.fftshift(np.fft.fft2(img_noise))
|
||||
IMG_NOISE_magnitude = np.abs(IMG_NOISE)
|
||||
cv2.imshow("IMG_NOISE_magnitude", IMG_NOISE_magnitude / visual_factor)
|
||||
|
||||
''' Bild anzeigen '''
|
||||
cv2.imshow("img", img)
|
||||
cv2.imshow("img_noise", img_noise)
|
||||
cv2. waitKey()
|
||||
28
3_Signalorientierte_Bildverarbeitung/ü3/l_b.py
Normal file
28
3_Signalorientierte_Bildverarbeitung/ü3/l_b.py
Normal file
@@ -0,0 +1,28 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
car = cv2.imread("../../data/car.png", cv2.IMREAD_GRAYSCALE)
|
||||
dog = cv2.imread("../../data/dog.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
''' FFT '''
|
||||
CAR = np.fft.fft2(car)
|
||||
CAR_magnitude = np.abs(CAR)
|
||||
CAR_angle = np.angle(CAR)
|
||||
|
||||
DOG = np.fft.fft2(dog)
|
||||
DOG_magnitude = np.abs(DOG)
|
||||
DOG_angle = np.angle(DOG)
|
||||
|
||||
mix1 = CAR_magnitude * np.exp(1j * DOG_angle)
|
||||
mix2 = DOG_magnitude * np.exp(1j * CAR_angle)
|
||||
|
||||
mix1 = np.fft.ifft2(mix1).astype(np.float32)
|
||||
mix2 = np.fft.ifft2(mix2).astype(np.float32)
|
||||
|
||||
''' Bild anzeigen '''
|
||||
cv2.imshow("car", car)
|
||||
cv2.imshow("dog", dog)
|
||||
cv2.imshow("mix1", mix1 / np.max(mix1))
|
||||
cv2.imshow("mix2", mix2 / np.max(mix2))
|
||||
|
||||
cv2.waitKey()
|
||||
25
3_Signalorientierte_Bildverarbeitung/ü3/l_c.py
Normal file
25
3_Signalorientierte_Bildverarbeitung/ü3/l_c.py
Normal file
@@ -0,0 +1,25 @@
|
||||
import cv2
|
||||
import numpy as np
|
||||
|
||||
img = cv2.imread("../../data/teppich.png", cv2.IMREAD_GRAYSCALE)
|
||||
|
||||
|
||||
''' FFT '''
|
||||
IMG = np.fft.fft2(img)
|
||||
MAGNITUDE = np.abs(IMG)
|
||||
ANGLE = np.angle(IMG)
|
||||
|
||||
''' Filter out frequencies '''
|
||||
print("Number of frequencies:", MAGNITUDE.shape)
|
||||
MAGNITUDE[0:150, 0:150] = 0
|
||||
|
||||
|
||||
''' IFFT '''
|
||||
IMG = MAGNITUDE * np.exp(1j * ANGLE)
|
||||
filtered_image = np.fft.ifft2(IMG).astype(np.float32)
|
||||
|
||||
''' Bild anzeigen '''
|
||||
cv2.imshow("img", img)
|
||||
cv2.imshow("filtered", filtered_image / np.max(filtered_image))
|
||||
|
||||
cv2.waitKey(0)
|
||||
Reference in New Issue
Block a user