Abtastung, Frequenz unterabgetastet Experiment in Python: horizontal und vertikal jedes N-te Pixel Unterabtastung Faktor N

Ähnliche Dokumente
-Pixelgrafik, Rastergrafik Beispiele: bmp (Bitmap) tiff (Tagged Image File Format, u. a. Rastergrafik, aber auch mehr) raw (reine Pixeldaten)

Praxiswerkstatt Algorithmen der Signalcodierung

Grundlagen der Videotechnik Python Video/Image Einführung. Zunaechst: Gängige Linux Konsolen Befehle:

Beate Meffert, Olaf Hochmuth: Werkzeuge der Signalverarbeitung, Pearson 2004

Grundlagen der Videotechnik. Redundanz

SSYLB2 SS06 Daniel Schrenk, Andreas Unterweger Übung 8. Laborprotokoll SSY. Diskrete Systeme II: Stabilitätsbetrachtungen und Systemantwort

Digitale Bildverarbeitung (DBV)

Versuch 3: Anwendungen der schnellen Fourier-Transformation (FFT)

Grundlagen der Videotechnik, Farbe 2

2. Digitale Codierung und Übertragung

Lösungsblatt 2 Signalverarbeitung und Klassifikation

Motivation. Diskretisierung. Überblick. Algorithmik III Algorithmen und Modelle für kontinuierliche Datenstrukturen. Diskretisierung und Quantisierung

Diskrete und Schnelle Fourier Transformation. Patrick Arenz

Multimediatechnik / Video

Bildverarbeitung Herbstsemester Fourier-Transformation

Bildkompression InTh, 2005, JPEG, Hak, Rur, 1

Objekterkennung durch Vergleich von Farben. Videoanalyse Dr. Stephan Kopf HWS2007 Kapitel 5: Objekterkennung

5. Fourier-Transformation

Debayeringverfahren. 19. Mai Thomas Noack, Nikolai Kosjar. SE Computational Photography - Debayeringverfahren

WM01 - DEMO - ECDL Image Editing

INTELLIGENTE DATENANALYSE IN MATLAB

(Bitte geben Sie bei der Beantwortung von Fragen eine Begründung bzw. bei der Lösung von Kurzaufgaben eine kurze Berechnung an!)

SiSy1, Praktische Übung 3. Fourier-Analyse (periodischer Signale) kann als Fourier-Reihe 1 beschrieben werden:

Die Interpretation Optischer Leistungsdaten

Grundlagen der Computer-Tomographie

Tutorium Mathematik II, M Lösungen

Visuelle Wahrnehmung I

Einführung in die Signalverarbeitung

Nachrichtentechnik [NAT] Kapitel 4: Fourier-Transformation. Dipl.-Ing. Udo Ahlvers HAW Hamburg, FB Medientechnik

Mathematische Erfrischungen III - Vektoren und Matrizen

filter Filter Ziele Parameter Entwurf Zölzer (2002) Nov 14, 2015

Versuch 5: Filterentwurf

Visual Computing Filtering, Fourier Transform, Aliasing

Bildrekonstruktion & Multiresolution

Bildwinkel & Auflösung

Biosignalverarbeitung (Schuster)

Filterung von Bildern (2D-Filter)

Grundlagen der Videotechnik Bau von Systemen Zweiter Ordnung, Prädiktion

Vom Zeit- zum Spektralbereich: Fourier-Analyse

Übung 6: Fast Fourier Transformation

Vortrag zur Helligkeitswahrnehmung

Digitales Fernsehen DVB

Einführung in die digitale Signalverarbeitung WS11/12

Argumente für die diskrete Realisierung der Fourierintegrale

Addition, Subtraktion und Multiplikation von komplexen Zahlen z 1 = (a 1, b 1 ) und z 2 = (a 2, b 2 ):

Inhaltsbasierte Bildsuche. Matthias Spiller. 17. Dezember 2004

Die Fourier-Transformation

28 4. DIE MATHEMATIK HINTER DER COMPACT DISC. Abbildung 4.1: Selbstkorrigierende Codes

Grundlagen der Schwingungslehre

Corinne Schenka Vorkurs Mathematik WiSe 2012/13

17 Grundrechenarten für komplexe Zahlen

Kontrollfragen zum Skript Teil 1 beantwortet

Zusammenfassung Digitale Bildverarbeitung By Fabian Flohrmann

5.1 Determinanten der Ordnung 2 und 3. a 11 a 12 a 21 a 22. det(a) =a 11 a 22 a 12 a 21. a 11 a 21

Aufgaben zu JavaKara: Arrays

Informatik I. Matthias Geel Büro: IFW A Blog:

Faltung, Korrelation, Filtern

3 Elementare Umformung von linearen Gleichungssystemen und Matrizen

Urs Wyder, 4057 Basel Funktionen. f x x x x 2

Kapitel 7. Bildverarbeitung im Frequenzraum

Modulationsanalyse. Amplitudenmodulation

4.4. Rang und Inversion einer Matrix

Einführung in die Signalverarbeitung

Mathematik II für Studierende der Informatik. Wirtschaftsinformatik (Analysis und lineare Algebra) im Sommersemester 2016

Tontechnik 2. Digitale Filter. Digitale Filter. Zuordnung diskrete digitale Signale neue diskrete digitale Signale

Signale und Systeme Ergänzungen zu den Spektraltransformationen

F u n k t i o n e n Gleichungssysteme

Die Taylorreihe einer Funktion

NÜTZLICHE TIPPS FÜR OPTIMALE SCANS

Einführung in QtiPlot

Sehen: Die Visuelle Wahrnehmung

Übungseinheit 3. FIR und IIR Filter

Primzahlen Darstellung als harmonische Schwingung

Bildbearbeitungstechniken Lehrerinformation

Bildverarbeitung: Fourier-Transformation. D. Schlesinger () BV: Fourier-Transformation 1 / 16

Digital Signal Processing

Technische Beschreibung der akustischen Signalkette

Signale und Systeme I

Multimediale Werkzeuge, Audio: Formate, Tools. -Sound/Audio Objekte. Formate, Beispiele:

Gitterherstellung und Polarisation

R.Wagner, Mathematik in der Astronomie

Behandlung der komplexen Darstellung von Wellen: Negative Frequenzen und komplexe Felder

Seminar Digitale Signalverarbeitung

Weißes Licht wird farbig

5 Eigenwerte und die Jordansche Normalform

9.2 Invertierbare Matrizen

Informationsverarbeitung im Bauwesen

Allgemeine Beschreibung von Blockcodes

7down Zusatzaufgaben. Mathias Ziebarth und Joachim Breitner. 13. März 2008

Computergraphik 1 2. Teil: Bildverarbeitung. Fouriertransformation Ende FFT, Bildrestauration mit PSF Transformation, Interpolation

Numerische Methoden und Algorithmen in der Physik

Besteht eine Matrix nur aus einer Spalte (Zeile), so spricht man auch von einem Spaltenvektor (Zeilenvektor)

TI-89. Gleichungssysteme

DIGITALE VIDEO KOMPRESSION AM BEISPIEL DES JPEG-VERFAHRENS

Färbungsbeweise. 1 Aufgaben

Digitale Signalbearbeitung und statistische Datenanalyse

Zusammenfassung der 1. Vorlesung

Maschinelles Lernen: Neuronale Netze. Ideen der Informatik

Aufgabe 2: Anzahl Erdbeben als Funktion der Zeit

Transkript:

Abtastung, Frequenz Wir haben gesehen dass die Farbkomponenten um einen Faktor 2 horizontal und vertikal unterabgetastet werden koennen. Aehnliches geschieht in der Retina: 110 Mio. Staebchen und 6 Mio. Zapfen werden in nur ca. 1 Mio. Nervenfasern eingespeisst. -Wie machen wir diese Unterabtastung richtig? Was kann schief gehen? Dazu machen wir ein Experiment in Python: Wir streamen wieder unser Videosignal, aber zeigen horizontal und vertikal nur jedes N-te Pixel an. Auf die Weise bekommen wir eine Unterabtastung um den Faktor N in beiden Richtungen. Im Beispiel ist N=4. Wesentliches im Listing des Python Skriptes videoresampley.py : -Initialisieren des Unterabgetasteten Frames: [ret, frame] = cap.read() [rows,cols,c]=frame.shape; Ds=np.zeros((rows,cols)); -Erzeugen des unterabgetasteten Frames: Ds[0::N,::N]=Y[0::N,::N]; Die Abkuerzung 0::N bedeutet: Die Indizes von 0 bis zum Ende in Schritten von N, also hier in

horizontaler und vertikaler Richtung. Wir haben also urspruengliche eine Matrix aus Nullen von der Groesse unseres Video Frames, und danach wird nur jedes N-te Pixel horizontal und vertikal dort hinein geschrieben. Wir koennen es ausprobieren mit: python videoresampley.py Beachte: Das Video erscheint wie aus vielen kleinen Punkten bestehend, der Inhalt ist aber noch gut erkennbar. Als naechstes erzeugen wir ein Testbild, bestehend aus Streifen die wir mittels einer Sinusfunktion fuer die Helligkeit erzeugen. Wir erzeugen eine Sinuswelle mit 100 Schwingungen ueber 1000 Pixel, die in den Positiven Bereich verschoben und skaliert auf den Bereich von 0,...,1 ist: f=100; sinewave=(1.0+np.sin(np.linspace(0,2*np.pi*f,1000)))/2 Die Addition von 1.0 ist um nur positive Helligkeitswerte zu erhalten, und das Teilen durch 2 um maximal einen Helligkeitswert von

1.0 zu erhalten, was cv2.imwrite bei float Werten erwartet. Anschliessend erzeugen wir 500 gleiche Zeilen mit dieser Sinusschwingung von 1000 Pixeln. Dazu wenden wir eine Matrix Trick an: Wir setzen die Sinuswerte auf die Diagonale einer 1000x1000 Diagonalmatrix, die wir von links mit einer 500x1000 Matrix bestehend aus Einsen multiplizieren: d=np.diag(sinewave) #Matrix with sinewave from left to right, #identically on each row, with 500 rows: A=np.dot(np.ones((500,1000)),d) Dies ergibt eine Matrix aus 500 Zeilen der Sinusschwingung. Anschliessend wird diese Matrix als Frame angezeigt und in einem jpg File gespeichert (zum Ausdrucken). Ausprobieren mit: python horizortsfreq.py Beachte: Wir bekommen ein Feld mit 100 vertikalen schwarz/weissen Streifen mit sanften Uebergaengen.

Beachte: Unsere benutzte Sinusschwingung hat eine Frequenz, naemlich diese 100 Schwingungen ueber die Breite der Zeilen. Um diese Frequenz von Zeitfrequenzen (in Schwingungen pro Sekunde oder Hertz) unterscheiden zu koennen, nennen wir sie Ortsfrequenz. Einheiten: Schwingungen pro Laenge (hier die Breite unserer Zeilen). Statt der Laenge ist es oft praktischer, den Winkel anzugeben unter der unsere Zeilen beim Betrachter erscheinen. Dann bekommen wir die Einheit Schwingungen pro Grad Wir drucken dieses Bild nun aus und nutzen es als Testbild indem wir das Streifenbild in mittlerer Entfernung vor die Kamera halten, und das unterabgetastete Bild beobachten. Wir sehen: Auf dem unterabgetasteten Bild erscheint nun nicht mehr nur das original Streifenmuster, sondern ein neues Muster aus Wellenlinien und langsameren Hell-Dunkel Schwankungen, die keine Aehnlichkeit mit dem Original haben! Wir nennen diese neuen Muster Moire oder oder allgemein in der digitalen

Signalverarbeitung Aliasing. Beachte: Wenn wir die Streifen dichter an die Kamera halten, so dass sie groesser erscheinen (weniger Helligkeits-Schwingungen pro Grad erscheinen der Kamera), verschwinden die Aliasing oder Moiree Effekte. Beispiel von einem Foto: Bild ohne Moire Bild mit Moire Aus: http://en.wikipedia.org/wiki/moire Wie fuehrt unsere Retina ihre Art von Unterabtastung durch, die Reduktion auf nur 1 Mio. Nervenfasern? Wir nehmen an dass hier das Problem des Aliasing bzw. Moiree geloest wurde.

Wenn wir auf die Retina sehen, erkennen wir sog. rezeptive Felder der Seh-Nervenzellen. Diese stellen eine Zusammenschaltung vieler Staebchen und Zapfen zu einem zentralen Sehnerv dar. Diese Zusammenschaltung ist so, dass sie eine sog. laterale Inhibition hat, die im folgenden skizziert ist. (von: http://www.pattern-project.org/heinz-waessle-vortrag) Wir sehen: Lichteinfall auf Lichtzellen am Rande

dieses rezeptiven Felder verringern den Output der Seh-Nervenzelle! Daher der Name laterale Inhibition oder Hemmung. Weitere Darstellung der Rezeptiven Felder auf der Retina: Retina - + - - + - Nerv zum Gehirn Beachte: Licht im Zentrum, im + Bereich, fuehrt zur Erhoehung des Signals im Nerv zum Gehirn, Licht am Rande, im - Bereich, fuehrt zur Reduktion des Signals. Beachte: Die Rezeptiven Felder ueberlappen sich.

Darstellung von der Seite : Beispiel: Kante Gewichte Orts- Filter Ortsfrequenzen Center sensor weight Negative weights Gewichte Sehzellen Webersches Gesetz Δ w w =konst Sehzellen Delta Wahrnehmung proportional Wahrnehmung Kompression des Wertebereichs für Nerven.Aus: http://www.ee.sieu.edu/~sumbaug/cvipbook_pplec/ Chapter7.ppt

Mult. mit Faktor entspricht konstanter Änderung der Wahrnehmung. Beisp: kleine Heiligkeit große Heiligkeit ΔA(x) mittlere Aktivität A 0 Eine Kante erzeugt durch diese Funktion größere Werte als eine konstante Fläche Hervorhebung von Kanten Erkennung von Objekten Output der Yellen

Von: H. Weisleder Helligkeit Lage im Raum Tasächliche Helligkeit wahrgenommene Helligkeit -> Effekt fer Hochpass Filterung wahrgenommene Helligkeit Lage im Raum Aus:www.ee.siue.edu/~sumbaug/CVIPbook_PPLec/Chapter7.ppt

Die Gewichtsverteilung der Rezeptiven Felder hat Aehnlichkeit mit einer sog. Si-Funktion (sh. Z.B. http://de.wikipedia.org/wiki/sinc-funktion) Definition: si(x)= sin(x) x Eine alternative Definition ist die sog. Sinc Funktion: sinc(x)= sin(π x) π x Wir plotten in ipython eine Si-Funktion mit: ipython --pylab x=linspace( 6.28,6.28,100) plot(x,sin(x)/x) title("si Funktion")

Es zeigt sich dass diese Funktion besondere Eigenschaften bei der sog. Discrete Fourier Transformation, kurz: DFT, hat. Die Diskrete Fourier Transform Wir haben gesehen dass beim Aliasing die Anzahl der Helligkeits-Schwingungen pro Grad einen Einfluss hat. Daher waere es hilfreich, wenn wir unser Bild oder Signal durch eine Summe von verschiedenen Sinusschwindugen Darstellen koennten. Dies ermoeglicht uns diese Discrete Fourier Transformation. Wir gehen aus von einem Signal x(n), z.b. die Intensitaetswerte einer Zeile, oder auch z.b. die Abtastwerte eines Audiosignales, mit einer Anzahl (Laenge) von N Werten, im Bereich 0 n N 1. Die DFT von x(n) ist definiert als: j 2 π N 1 X (k)= x(n) e N n k (1) n=0 X(k) sind die resultierenden N Koeffizienten der DFT Zerlegung, mit dem Frequenzindex k mit 0 k N 1. Die inverse DFT nimmt diese N Koeffizienten um

damit eine gewichtete Summe aus Schwingungen zu bilden, die das Original Signal x(n) darstellen: x(n)= 1 j 2 π N N 1 X (k) e N n k (2) k=0 Hierbei ist e j ω =cos(ω)+ j sin(ω) (3) und j ist die komplexe Einheit mit der Eigenschaft j 2 = 1. Beachte: Die Koeffizienten sind in der Regel Komplexwertig. Wir sehen: Die inverse DFT beschreibt jedes Signal x(n) als Summe von gewichteten Sinus und Cosinus Schwingungen unterschiedlicher Frequenz. Es gibt schnelle, sehr effiziente Algorithmen zur Berechnung der DFT und der inversen DFT. Diese werden Fast Fourier Transform, kurz FFT genannt. In Python ist sie im Paket numpy.fft enthalten. Beispiel in ipython: ipython pylab In [17]: x=sign(sin(2.0*pi/8*arange(0,8))) In [18]: x Out[18]: array([ 0., 1., 1., 1., 1., 1., 1., 1.]) In [19]: X=fft.fft(x) In [20]: X

Out[20]: array([ 1.+0.j, 1. 4.82842712j, 1.+0.j, 1. 0.82842712j, 1.+0.j, 1.+0.82842712j, 1.+0.j, 1.+4.82842712j]) In [21]: ifft(x) Out[21]: array([ 5.55111512e 17 +0.00000000e+00j, 1.00000000e+00 +5.55111512e 16j, 1.00000000e+00 8.32667268e 16j, 1.00000000e+00 3.88578059e 16j, 1.00000000e+00 +0.00000000e+00j, 1.00000000e+00 5.55111512e 16j, 1.00000000e+00 +8.32667268e 16j, 1.00000000e+00 +3.88578059e 16j]) Beachte: Die Koeffizienten X sind tatsaechlich komplexwertig. Weiterhin sind sie symmetrisch um das Zentrum herum, aber mit umgekehrtem Vorzeichen bei den Imaginaerteilen (konjugiert komplex). Um zu sehen woher diese symmetrie kommt, plotten wir die Sinus-Schwingungen der obigen DFT (entsprechen Gleichungen (1), (2), (3)) fuer die Frenquenz-Indizes k=1 und k=7 in ipython: x1=sin(2.0*pi/8*1*arange(0,8)) plot(x1) x7=sin(2.0*pi/8*7*arange(0,8)) plot(x7) title('sinus Basisfunktionen 1 und 7')

Wir sehen: Diese beiden Schwingungen (auch Basisfunktionen genannt), sind in der Tat identisch, bis auf das umgekehrte Vorzeichen! Daher die Symmetrie. Die entsprechenden Cosinus Funktionen waere sogar voellig identisch. Daher die beobachtete Symmetrie. Aus diesem Grund erreichen wir die hoechste Frequenz, die meisten Schwingunen, bei einem mittleren Frequenzindex k, in unserem Beispiel fuer k=4. In ipython nehmen wir diesmal den Cosinus Term, da der Sinus Term hier verschwindet:

x=cos(2.0*pi/8*4*arange(0,8)) plot(x) title('cos Basisfunktion fuer k=4') Illustration 1: x-achse: Ort n, y-achse: Abtastwert Python Echtzeit Beispiel: Das Audiosignal vom Mikrofon wird in Abschnitte (Bloecke) von 1024 Abtastwerten unterteilt, auf jeden dieser Bloecke wird die FFT angewendet, und dann der Betrag der Koeffizienten X(k) live auf dem Plot dargestellt.

python pyrecfftanimation.py Beachte: Wir sehen wieder die Symmetrie ums Zentrum. Beim Pfeifen sehen wir groessere Koeffizienten beim entprechenden Frequenz- Index k. Die hoechsten Frequenzen erscheinen in der Mitte. Wenn wir die Betraege der DFT Koeffizienten als unterschiedliche Farben darstellen; auf der x-achse die erste Haelfte der DFT Koeffizienten, so dass die Koeffizienten mit den tiefsten Frequenzen sich links befinden und die mit den hoechsten Frequenzen rechts, und wir nach oben auf die y- Achse die Zeit auftragen, erhalten wir das sog. Wasserfall Diagramm, auch Spectrogram genannt. Also: x-achse: Frequenz, y-achse: Zeit Farbe: Betrag (Groesse) der jeweiligen DFT Koeffizienten X(k). Das sehen wir duch den Aufruf: python pyrecspecwaterfall.py Beachte: Wenn wir einen Ton pfeifen, erscheint er als gelber Streifen, horizontal bei der entsprechenden Frequenz des Tones. Hohe Toene erscheinen weiter rechts.

Die DFT bzw. FFT koennen wir auch leicht auf Bilder anwenden, indem wir sie zuerst auf jede Zeile des Bildes anwenden, und auf das Resultat die DFT auf jede Spalte anwenden. In python gibt es dazu die Funktion fft2. Python live Video Beispiel: In python verwenden wir die Funktion numpy.fft.fft2(..) zum Berechnen der 2D FFT fuer jedes Frame der Gruen-Komponente unseres Video Streams. Zum Darstellen im Video Fenster verwenden wir den Betrag der FFT Koeffizienten mit numpy.abs(..). Im Folgenden ist das Skript videorecfftdisp.py gezeigt: #Program to capture a video from the default camera (0), compute the 2D FFT #on the Green component, take the magnitude (phase) and display it live on the screen #Gerald Schuller, Nov. 2014 import cv2 import numpy as np cap = cv2.videocapture(0) while(true): # Capture frame by frame [retval, frame] = cap.read() #compute magnitude of 2D FFT of green component #with suitable normalization for the display:

frame=np.abs(np.fft.fft2(frame[:,:,1]/255.0))/512.0 #angle/phase: #frame=(3.14+np.angle(np.fft.fft2(frame[:,:,1]/ #255.0)))/6.28 # Display the resulting frame cv2.imshow('frame',frame) #Keep window open until key 'q' is pressed: if cv2.waitkey(1) & 0xFF == ord('q'): break # When everything done, release the capture cap.release() cv2.destroyallwindows() Wir starten es mit python videorecfftdisp.py und halten dann unser Testbild in verschiedenen Entfernungen vor die Kamera. Wir beobachten: Beim vor die Kamera halten des Testbildes entstehen eine Reihe von mehr oder weniger dicken und hellen Punkte, wie auf einer Linie. Je weiter wir das Bild von der Kamera entfernen (also groesser die Zahl der Helligkeits- Schwingungen pro Grad fuer die Kamera wird), desto weiter entfernt voneinander erscheinen die Punkte. Beachte: Die Lage der Punkte ist abhaengig von der Ortsfrequenz, die die Kamera wahrnimmt. Die hoechsten Ortsfrequenzen erscheinen in der Mitte des Bildes, mit einer Symmetrie um dieses Zentrum. Die tiefsten horizontalen Ortfrequenzen

befinden sich an den linken und rechten Raendern, die tiefsten vertikalen Ortsfrequenzen befinden sich am oberen und unteren Rand. Beachte: Zusammen mit der Phase der FFT Komponenten enthaelt dieses Bild der Betraege immer noch die gesamte Information des urpsruenglichen Videos (da die FFT invertierbar ist). Vermeidung von Aliasing/Moiree Wir sahen in unsrem Experiment, dass Aliasing/Moiree nur bei vielen Helligkeits- Schwingungen pro Grad, also bei hohen Ortsfrequenzen auftrat. Wir koennten es also vermeiden wenn wir diese hohen Ortsfrequenzen im Bild zu Null setzen wuerden, bevor wir das Bild Unterabtasten. Da die DFT invertierbar ist, koennen wir dies erreichen indem wir die entsprechenden DFT Koeffizienten der hohen Ortsfrequenzen zu Null setzen und anschliessend mit der IDFT wieder das Bild bzw. Video erzeugen. Dies machen wir mit einer Maske, die wir auf die 2D-DFT unseres Bildes/Videos multiplizieren. Nehmen wir an, 1 entspricht der hoechsten Frequenz, und wir moechten nur die DFT Koeffizienten der 1/4 tiefsten Frequenzen behalten. Eine Zeile hat z.b. 640 Pixel (und damit die DFT 640

Koeffizienten pro Zeile). Wegen der Symmetrie um die Mitte sitzt die hoechste Frequenz in der Mitte, und wir bekommen 2 Haelften mit gleichem Inhalt. Daher muessen wir an jedem Ende nur 1/8 der gesamten Koeffizienten behalten, und den Rest zu Null setzen. Eine Entsprechende Maske fuer 1 Dimension waere folgende: ipython pylab M=ones((640)) M[(640.0/8):(640 640.0/8)]=zeros((3.0/4.0*640)) plot(m) axis([0, 640, 0.1, 1.1]) title("maske fuer tiefe Frequenzen") Da diese Maske angibt, welche Frequenzen wie stark uebertragen werden, wird sie auch Uebertragungsfunktion genannt.

Illustration 2: x-achse: Frequenz-Index k, y-achse: Wert der Maske Fuer 2 Dimensionen, wie in unserm Fall fuer Bilder, wenden wir die Maske einfach fuer jede Dimension an. Wenn r die Anzahl der rows (Zeilen) und c die der columns (Spalten) ist, nehmen wir entsprechend in

python: #For rows: Mr=np.ones((r,1)) Mr[(r/8.0):(rr/8.0),0]=np.zeros((3.0/4.0*r)) #For columns: Mc=np.ones((1,c)) Mc[0,(c/8.0):(c c/8)]=np.zeros((3.0/4.0*c)); #Together: M=np.dot(Mr,Mc) plt.plot(m) Illustration 3: x- und y-achse: frequenz-index k, Farbwert: Wert der Maske Wenn wir diese Maske (Uebertragungsfunktion) mit unseren DFT Koeffizienten (elementweise)

multiplizieren, werden alle Koeffzienten bei hohen Ortsfrequenzen zu Null gesetzt. Aus der Eigenschaft dass diese Maske ein Filter darstellt, welches nur die Tiefen Frequenzen passieren laesst, wird sie auch Tiefpass Filter genannt. Wir erzeugen die 2D-FFT und setzen die Maske zum Nullsetzen ein: X=np.fft.fft2(frame[:,:,1]/255.0) #Set to zero the 3/4 highest spacial frequencies in each direction: X=X*M Wenn wir diese neuen Koeffizienten dann mittels der inversen DFT zurueck transformieren, erhalten wir ein Bild/Video ohne diese hohen Ortsfrequenzen: x=np.abs(np.fft.ifft2(x)) Beachte: Hier verwenden wir den Befehl abs, um wieder relle Zahlen zu erhalten, denn die inverse FFT erzeugt komplexe Zahlen, obwohl hier die Imaginaerteile bis auf Rechenungenauigkeit zu Null werden. Das folgende Python Skript zeigt diesen Prozess: python videorecfft0ifftdisp.py

Beachte: Das rekonstruierte Bild/Video nach der inversen FFT enthaelt in der Tat weniger hohe Ortsfrequenzen, und sieht daher unschaerfer aus. Aus Signale und Systeme wissen wir: Eine Multiplikation im Fourier Bereich entspricht eine sog. Faltung (Convolution in Englisch) der entspechenden Signale im Orts- oder Zeit-Bereich. Da wir es hier mit endlichen Signalen zu tun haben, dessen Laenge wir N nennen, bekommen wir eine sog. zyklische Faltung (circular convolution). Das Filter (oder die Maske) als Signal im Ortsbereich (durch inverse FFT) wir auch Impulsantwort des Filters genannt. Nehmen wir an, x(n) ist unser Signal im Ortsbereich, und h(n) unser Filter im Ortsbereich (die Impulsantwort), dann ist die zyklische Faltung: N 1 y(n)=x(n) N h(n):= i=0 x(i) h((n i)mod N) wobei mod die Modulus Funktion ist, der Rest nach ganzzahliger Teilung von (n-i) durch N (auf N-1 folgt wieder die 0), d.h. diese Faltungs-Summe laeuft zyklisch im Kreis. Das h(n) erhalten wir duch die inverse FFT unserer Maske M (hier im Beispiel zur besseren Sichtbarkeit fuer die 1/8 tiefsten Frequenzen). In ipython:

ipython pylab M=ones((640)) M[(640.0/16):(640 640.0/16)]=zeros((7.0/8.0*640)) h=fft.ifft(m) plot(h) Illustration 4: x-achse: Orts-Index n, y-achse: Abtastwert Durch die zyklische Faltung laeuft das Signal (die Impulsantwort) praktisch im Kreis, wir koennen daher auch eine um 320 Werte zyklisch verschobene Version betrachten: hc=concatenate((h[320:640],h[0:320])) plot(hc) title("zyklisch verschobene Inv FFT unserer

Tiefpass Maske") Beachte: Dies sieht nun aus wie die Sinc oder Si- Funktion, mit der die Gewichte der Rezeptiven Felder der Retina Aehnlichkeit hatten. Wenn wir nun nach dieser Tiefpass-Filterung die Unterabtastung um den Faktor N vornehmen, bedeutet dies dass wir nur jedes N-te Pixel oder jeden N-ten Wert uebernehmen. Dies entspricht der Ersetzung unseres Index n in der Faltungs-Gleichung durch mn, wobei m eine ganze Zahl ist:

N 1 y(mn)= i=0 x (i) h((mn i)mod N) Diese Summe zeigt uns: fuer jeden uebernommenen Wert y(mn) bilden wir eine Summe ueber die verschobene Impulsantwort des Filters an der Position mn: h((mn i)mod N ) Beispiel in ipython: Wr nehmen unser grade berechnete Impulsantwort hc und setzen N=8. Dann erhalten wir fuer 2 benachbarte Positionen m und m+1, fuer einen Auschnitt mit den rund 40 groessten Werten: plot(hc[300:340]) plot(hc[308:348]) title("2 benachbarte Impulsantworten fuer Abtastfaktor N=8" )

Illustration 5: x-achse: Orts-Index n, y-achse: Abtastwert Beachte: Wir sehen eine Ueberlappung der benachbarten Impulsantworten. Dies entspricht im 2-Dimensionalen und auf der Retina der Ueberlappung der Rezeptiven Felder! Hierzu koennen wir uns auch die inverse FFT unserer 2D Maske M in ipython ansehen: ipython pylab r=480 c=640 #For rows: Mr=ones((r,1)) Mr[(r/8.0):(r r/8.0),0]=zeros((3.0/4.0*r))

#For columns: Mc=ones((1,c)) Mc[0,(c/8.0):(c c/8)]=zeros((3.0/4.0*c)); #Together: M=dot(Mr,Mc) h=fft.ifft2(m) #Rotieren: hc=concatenate((h[:,320:640],h[:,0:320]),axi s=1) hc2=concatenate((hc[240:480,:],hc[0:240,:]), axis=0) imshow(real(hc2[230:250,310:330])/0.07) title('ausschnitt der Impulsantwort unseres 2D Tiefpass Filters') Illustration 6: x- und y-achse: Orts-Indizes, y-achse: Farbwert entspricht Aptastwert

Tief-Blau sind die kleinsten (negativen) Werte, rot die groessten (positiven) Werte. Beachte: Diese falschfarben Darstellung der inversen FFT bzw. 2D-Impulsantort hat nun auch Aehnlichkeit mit den beobachteten rezeptiven Feldern auf der Retina Python Beispiel: Die Library scipy.signal enthaelt Funktionen zur 2D Faltung: scipy.signal.convolve2d(x,h) faltet zwei 2-dimensionale Signale x und h, wobei x z.b. unser Frame und h unsere Filter Impulsantwort ist. Diese verwenden wir im Skript videofiltdisp.py. Darin berechnen wir die Impulsantwort h als inverse FFT unserer Uebertragugnsfunktion M. Wir muessen dabei die Groesse der 2D-Impulsantwort drastisch begrenzen, damit noch eine Echtzeitverarbeitung moeglich ist. Das zeigt: Fuer Filter mit grosser Impulsantwort ist die Berechnung mittels FFT deutlich effizienter als die Faltung. Wir fuehren das Skript aus mit: python videofiltdisp.py Beachte: Das gefilterte Bild/Video sieht aehnlich aus wie bei der Implementierung mittels FFT.

Wir sehen also: Die Rezeptiven Felder auf der Retina entsprechen einer Filterung des Bildes, und deren Abstand entspricht der Unterabtastung fuer die geringere Anzahl von Sehnerven. Die Uebertragunsfunktion des menschlichen Auges kann auch experimentell durch Sehtests gemessen werden. Das ergibt die sog. Contrast Sensitivity Function (CSF). Beispiel: Grund- Helligkeit Max. für helles Licht: 2 perioden/grad (cycles=perioden) Max. für dunkles Licht: 0.7 per./grad feine Detailes von Bildern: Auge ist weniger empfindlich Ortsfrequenz (perioden/grad) grad: Unabhängig von sehentfernung Hell-Dunkel Schwankung (Aus: http://www.ee.sieu.edu/~sumbaug/cvipbook_pplec/chapter7.ppt) Wir sehen: Die Uebertragungsfunktion ist nicht genau ein Tiefpass Filter, sondern eher eine Art Tiefpass mit Anhebung der mittleren Frequenzen. Unser Auge ist fuer diese mittleren Ortsfrequenzen am empfindlichsten.

Durch raffinierte Tests lassen sich auch die CSF der Augen anderer Lebewesen ermitteln:

Contrast Sensitivity Function unterschiedliche Lebewesen im Vergleich Aus: Harmening, Vossen, Wagner, van der Willigen The disparity sesitivity function compared new insights from barn owl vision, EVCP09

Die Unterschiedliche Anzahl der Zapfen und Staebchen auf der Retina macht sich durch unterschiedliche CSF fuer Farbe und Helligkeit bemerkbar: Unterschiede der Maxima entsprechen etwa den unterschieden der Dichte der Stäbchen (Helligkeit) und der Zapfen (Farbe): 100 6 4

Rekonstruktion des Bildes im Decoder Wir koennen nun das Unterabgetastete Bild mit weniger Pixeln und damit gerinegrer Bitrate zum Decoder uebertragen. Wie machen wir daraus wieder ein ansehnliches Bild? Wir haben gesehen: Wenn wir einfach nur die uebertragenen Pixel an die richtige Stelle setzen, und die andern Pixel bei Wert Null belassen, bekommen wir ein Bild was aus vielen kleinen Punkten besteht. Es ist interessant sich das Spektrum dieses Punkte- Bildes anzusehen. Das machen wir mit folgendem python Skript. Hier sehen wir die folgenden Bearbeitungsschritte: Frame-Tiefpassfilter-Abtastung (Nullen entfernen- Übertragen - Nullen einsetzen) Tiefpassfilter- Rekonstruierter Frame. Starte mit: python videofft0ifftresampleykey.py Beachte: Das Video in Decoder: FFT Bereich der Sampled Frames zeigt: Anders als beim urspruenglichen Bild entstehen hier periodische Fortsetzungen des Spektrums in x- und y- Richtung.

Da diese im Original nicht vorhanden waren, und sie somit Artifakte darstellen (naemlich unser Aliasing), sollten wir sie einfach zu Null setzen. Dies funktioniert praktischerweise wieder mit unserer Maske oder dem Tiefpassfilter M, welchen wir wieder im FFT Bereich anwenden. Dazu betrachten wir wieder die Outputs unseres Python Skriptes. Beachte: Das so im Dekoder rekonstrierte Bild im Fenster Decoder: Gefilterte Sampled Frames sieht in der Tat wieder fast aus wie unser im Encoder Tiefpass-Gefilterte Bild! Zusammenfassung: Wir sind so in der Lage, die Anzahl der zu uebertagenen Pixel um dem Faktor N*N zu reduzieren, bei gleicher Bildgroesse, allerdings auf Kosten der Bildschaerfe. Dies stellt eine weitere Kompressionsmoeglichkeit dar. Die Kunst ist nun, die Anzahl der uebertragenen Pixel (die Aufloesung) so zu waehlen, dass das Auge die Unschaerfe grade nicht wahrnimmt. Verarbeitungs-Sequenz: -Encoder: Filtern- Unterabstasten-Nullen entfernen -Decoder: Nullen einsetzen- Filtern

Referenzen: Circular convolution, zyklische Faltung, sh. S. 542, Spectrogram: S. 742: A. Openheim, R. Schafer: Discrete Time Signal Processing, Prentice Hall. Quantisierung In einem Video-Coder muessen wir unsere Werte quantisieren, wofuer wir wissen muessen, wieviele Intensitaetsstufen das Menschliche Auge unterscheiden kann: -ca. 20 Helligkeitsänderungen in einem kleinem Gebiet in komplexen Bild Wahrnehmbar -ca. 100 Graustufen benötigt (7 bit/pixel) um künstliche Konturen zu vermeiden Aus: www.ee.siue.edu/~sumbaug/cvipbook_pplec/chapter7.ppt