Grafik Pipeline hydriert
This commit is contained in:
		
							parent
							
								
									e7a7463ce5
								
							
						
					
					
						commit
						988e85f409
					
				
										
											Binary file not shown.
										
									
								
							| @ -1463,7 +1463,7 @@ | ||||
|     \item Abbildung Texturpixels auf mehrere Bildpixel (Überabtastung - Magnification) | ||||
|     \item Filteroperationen zur Interpolation der Bildpixel-Färbung notwendig | ||||
|     \item Ansonsten Verletzung des Abtasttheorems/Nyquistfrequenz | ||||
|   \end{itemize*}   | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \paragraph{Aufbau} | ||||
|   \begin{itemize*} | ||||
| @ -1471,18 +1471,18 @@ | ||||
|     \item im Bild oft Unter- oder Überabtastung und Aliasing | ||||
|     \item Vorberechnung derselben Textur für versch. Entfernungen | ||||
|     \begin{itemize*} | ||||
|     \item Stufe 1: volle Auflösung | ||||
|     \item Stufe 2: halbe Auflösung in jeder Richtung $(1/2)$ | ||||
|     \item Stufe k: Auflösung $(1/2)^k$ | ||||
|     \item Stufe n: niedrigste Auflösung (je 1 Pixel für RGB) | ||||
|       \item Stufe 1: volle Auflösung | ||||
|       \item Stufe 2: halbe Auflösung in jeder Richtung $(1/2)$ | ||||
|       \item Stufe k: Auflösung $(1/2)^k$ | ||||
|       \item Stufe n: niedrigste Auflösung (je 1 Pixel für RGB) | ||||
|     \end{itemize*} | ||||
|     \item Speicherbedarf: | ||||
|     \item (hypothetische) Annahme: Anordnung im Array (getrennt f. RGB) $\rightarrow$ Alle niedrigen Auflösungen verbrauchen zusammen nur ein Viertel des Speicherplatzes | ||||
|     \item Mip:\textit{multum in parvo} = viel (Info) auf wenig (Speicher) | ||||
|     \item niedrige Auflösungsstufen werden durch Filterung aus den höheren berechnet | ||||
|     \begin{itemize*} | ||||
|     \item einfach: z.B. Mittelwert aus 4 Pixeln (Box-Filter) | ||||
|     \item aufwendiger: z.B.: Gaußfilter | ||||
|       \item einfach: z.B. Mittelwert aus 4 Pixeln (Box-Filter) | ||||
|       \item aufwendiger: z.B.: Gaußfilter | ||||
|     \end{itemize*} | ||||
|     \item Filter-Operationen können bei Initialisierung der Textur vorausberechnet werden | ||||
|     \item nur ein Drittel zusätzlicher Speicherplatzbedarf | ||||
| @ -1501,7 +1501,7 @@ | ||||
|     \item passende Auflösungsstufe k Skalierung berechnet aus der Entfernung zum Betrachter und der perspektivischen Verkürzung: $d/z = (1/2)^k \rightarrow k = log_2(z)-log_2(d)$ | ||||
|     \item Transformation der Pixel zwischen Textur- Eckkoordinaten der gewählten Auflösung auf Polygon im Bildraum | ||||
|     \item Vermeidung von Aliasing-Effekten durch Trilineare Filterung: Mip-Map-Stufe wird linear gewichtet zwischen zwei Mip-Map-Stufen interpoliert: z. B. wenn $k = 2.3 \rightarrow 30\% Anteil_{k=3}$ und $70\% Anteil_{k=2}$ | ||||
|   \end{itemize*}   | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \paragraph{Anti-Aliasing} | ||||
|   durch trilineare Filterung | ||||
| @ -1522,7 +1522,7 @@ | ||||
|     \item Verschiedene Auflösungsstufen in x- und y-Richtung erzeugt | ||||
|     \item Vierfacher Speicherbedarf gegenüber höchster Auflösung | ||||
|   \end{itemize*} | ||||
| 
 | ||||
|    | ||||
|   \paragraph{Bump-Map} | ||||
|   \begin{itemize*} | ||||
|     \item Reliefartige Texturen: Herkömmliche Texturen von Nahem erscheinen flach | ||||
| @ -1559,15 +1559,15 @@ | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \subsection{Shadow Mapping} | ||||
|     \begin{itemize*}  | ||||
|       \item Erzeugen der Shadow Map | ||||
|       \item Darstellung (mit z-Werten) aus Sicht der Lichtquelle | ||||
|       \item Kamera Koordinaten in Lichtquelle zentriert (Matrix L) | ||||
|       \item z-Puffer als Textur speichern | ||||
|       \item Kamera Ansicht: View Matrix V (mit z-Puffer) | ||||
|       \item Um Schatten zu erzeugen benötigen wir Shader mit Lookup | ||||
|       \item 4x4-Matrix: $M = V^{-1}*L$ | ||||
|     \end{itemize*} | ||||
|   \begin{itemize*}  | ||||
|     \item Erzeugen der Shadow Map | ||||
|     \item Darstellung (mit z-Werten) aus Sicht der Lichtquelle | ||||
|     \item Kamera Koordinaten in Lichtquelle zentriert (Matrix L) | ||||
|     \item z-Puffer als Textur speichern | ||||
|     \item Kamera Ansicht: View Matrix V (mit z-Puffer) | ||||
|     \item Um Schatten zu erzeugen benötigen wir Shader mit Lookup | ||||
|     \item 4x4-Matrix: $M = V^{-1}*L$ | ||||
|   \end{itemize*} | ||||
|   % | ||||
|    | ||||
|   Shadow map look-up: | ||||
| @ -1590,7 +1590,7 @@ | ||||
|   \end{itemize*} | ||||
|   \begin{description*} | ||||
|     \item[Uniform Shadow-Map] Probleme: zu niedrige Auflösung der Shadow Map im Nahbereich, Großteil der Shadow Map ist irrelevant für Kameraansicht | ||||
|   \item[Perspektive Shadow-Map] adaptive schiefsymtetrische Projektion; nicht uniforme perspektive Shadow Map | ||||
|     \item[Perspektive Shadow-Map] adaptive schiefsymtetrische Projektion; nicht uniforme perspektive Shadow Map | ||||
|   \end{description*} | ||||
|    | ||||
|   \subsection{Zusammenfassung} | ||||
| @ -1615,98 +1615,107 @@ | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \subsection{Bestandteile} | ||||
|   Programm API -> Treiber -> Vertex-Verarbeitung -> Primitivenbehandlung -> Rasterisierung \& Interpolation -> Fragment Verarbeitung -> Rasteroperation -> Bildspeicher | ||||
|   \begin{enumerate*} | ||||
|     \item Programm API  | ||||
|     \item Treiber  | ||||
|     \item Vertex-Verarbeitung  | ||||
|     \item Primitivenbehandlung  | ||||
|     \item Rasterisierung \& Interpolation  | ||||
|     \item Fragment Verarbeitung  | ||||
|     \item Rasteroperation  | ||||
|     \item Bildspeicher | ||||
|   \end{enumerate*} | ||||
|    | ||||
|   \subsection{Allgemeines} | ||||
|   \subsection{Allgemein} | ||||
|   \begin{itemize*} | ||||
|     \item Anwendungsprogramm: | ||||
|     \begin{itemize*} | ||||
|       \item läuft auf der CPU, | ||||
|       \item definiert Daten und Befehlsabfolge, | ||||
|       \item greift dazu über das Grafik-API (Application Programming Interface, z. B. OpenGL, Direct3D) auf die Grafikkarte zu | ||||
|       \item greift dazu über das Grafik-API (z.B. OpenGL, Direct3D) auf die Grafikkarte zu | ||||
|     \end{itemize*} | ||||
|     \item Treiber: übersetzt die Grafikbefehle des Programms in die Maschinensprache der speziellen Grafikhardware (Graphics Processing Unit / GPU, z.B. von nVidia, AMD oder Intel) | ||||
|     \item Treiber: übersetzt die Grafikbefehle des Programms in die Maschinensprache der speziellen Grafikhardware (Graphics Processing Unit) | ||||
|     \item Befehle und Daten werden über den Bus (z.B. PCI-Express) von der CPU auf die GPU übertragen | ||||
|     \item OpenGL-Pipeline: Abarbeitung der Grafikbefehle auf der GPU | ||||
|     \item Ausgabe des Bildspeichers auf dem Monitor | ||||
|     \item Treiber schickt Daten/Befehle an die GPU (z. B. via PCIe -Bus) | ||||
|     \item Funktionsausführung auf der GPU ist dann abhängig vom aktuellen Zustand (OpenGL State Machine bzw. den gewählten Shadern):z.B. vorher definierter Primitivtyp (hier GL Polygon), Transformation, Lichtquellen, Interpolationsart (z.B. Gouraud Shading vs. Flat Shading) | ||||
|     \item Funktionsausführung auf der GPU ist dann abhängig vom aktuellen Zustand | ||||
|   \end{itemize*} | ||||
|    | ||||
|   Abarbeitungsreihenfolge auf der GPU: | ||||
|   \paragraph{Abarbeitungsreihenfolge auf der GPU} | ||||
|   \begin{itemize*} | ||||
|     \item Empfangen der Vertices in einer geordneten Sequenz. | ||||
|     \item Vertexverarbeitung via Vertex Shader. Jeder Input-Vertex im Datenstrom wird in einen Output-Vertex transformiert und beleuchtet. | ||||
|     \item Empfangen der Vertices in einer geordneten Sequenz | ||||
|     \item Vertexverarbeitung via Vertex Shader. Jeder Input-Vertex im Datenstrom wird in einen Output-Vertex transformiert und beleuchtet | ||||
|     \item Primitive culling (Verwerfen wenn nicht sichtbar) und clipping (Abschneiden der Polygone am Rand) | ||||
|     \item Rasterkonvertierung (Polygon Filling) und Interpolation der Attributwerte (x-Koordinate, 1/z, R, G, B, Texturkoordinaten u/v, ...) | ||||
|     \item Die Daten jedes Fragmentes (Pixel/Subpixel) wird mit einem Fragment Shader verarbeitet. Zu jedem Fragment gehört eine Anzahl Attribute. | ||||
|     \item Die Daten jedes Fragmentes (Pixel/Subpixel) wird mit einem Fragment Shader verarbeitet. Zu jedem Fragment gehört eine Anzahl Attribute | ||||
|     \item Per-Sample Operationen: Blending (Alpha-Blending bei Transparenz), Tiefen- und Stencil- Operationen ... | ||||
|   \end{itemize*} | ||||
|    | ||||
|    | ||||
|   \subsection{Vertex-Verarbeitung} | ||||
|   \begin{itemize*} | ||||
|     \item Transformationen: Modell-Transformation, Kamera-Transformation (Model View Matrix) → Matrixmultiplikationen → Skalarprodukt | ||||
|     \item Beleuchtung (Lighting): Lichtquellen, diffuses \& spekuläres Material: (Gouraud Shading) Lambert, Phong-Modell → Skalarprodukt | ||||
|     \item Skalarprodukte (Gleitkomma-Multiplikationen und Additionen) werden durch viele parallele Prozessoren auf der GPU effizient verarbeitet. | ||||
|   \end{itemize*} | ||||
|   \begin{description*} | ||||
|     \item[Transformationen] Modell-Transformation, Kamera-Transformation (Model View Matrix) $\rightarrow$ Matrixmultiplikationen $\rightarrow$ Skalarprodukt | ||||
|     \item[Beleuchtung] Lichtquellen, diffuses \& spekuläres Material: Lambert, Phong-Modell $\rightarrow$ Skalarprodukt | ||||
|     \item[Skalarprodukte] (Gleitkomma-Multiplikationen und Additionen) werden durch viele parallele Prozessoren auf der GPU effizient verarbeitet | ||||
|   \end{description*} | ||||
|    | ||||
|   %\subsection{Primitive & Primitivenbehandlung} | ||||
|   % | ||||
|    | ||||
|   \subsection{Rasterkonvertierung} | ||||
|   \begin{itemize*} | ||||
|     \item Edge Tables bereits erzeugt (Polygonsetup in Primitivenbeh.) | ||||
|     \item Rasterkonvertierung/Interpolation entspricht der Scan-Line-Konvertierung (s. Polygonfüllalgoritmus), generiert Pixel (Fragments) | ||||
|     \item Interpolation der x-Werte der Kanten (siehe left edge scan /bzw. right edge scan) | ||||
|     \item pro Scan Line: inkrementiere x-Wert (left edge, right edge) (OpenGL behandelt nur konvexe Polygone/Dreiecke – d. h. immer 2 Kanten pro Bildzeile!) | ||||
|     \item lineare Interpolation weiterer Attribute: | ||||
|     \item Edge Tables bereits erzeugt (Polygonsetup) | ||||
|     \item Rasterkonvertierung/Interpolation entspricht der Scan- Line-Konvertierung, generiert Pixel (Fragments) | ||||
|     \item Interpolation der x-Werte der Kanten (left/right edge scan) | ||||
|     \item pro Scan Line: inkrementiere x-Wert (left/right edge) | ||||
|     \item lineare Interpolation weiterer Attribute | ||||
|     \begin{itemize*} | ||||
|       \item z (1/z)-Werte, | ||||
|       \item $z (1/z)$-Werte, | ||||
|       \item RGB-Werte (Gouraud Shading), | ||||
|       \item Texturkoordinaten u/v (affines Texturmapping), | ||||
|       \item Normalen (Phong Shading) | ||||
|     \end{itemize*} | ||||
|     \item sehr wenige Ganzzahloperationen pro Pixel/Bildzeile | ||||
|     \item Ausnahmen: z. B. perspektivische Texture Maps (FP-Division!) | ||||
|     \item Ausnahme z.B. perspektivische TM (FP-Division) | ||||
|   \end{itemize*} | ||||
|    | ||||
|    | ||||
|   \subsection{Fragment-Verarbeitung} | ||||
|   Weiterverarbeitung auf Basis der interpolierten Attribute im Fragment Shader | ||||
|    | ||||
|   Beispiel Phong-Shading: Berechnung des Phong-Beleuchtungsmodells auf Basis der vorher linear interpolierten Fragmentnormalen, -position und Materialdaten sowie der Daten der Lichtquellen und Kameraposition | ||||
|   \begin{itemize*} | ||||
|     \item Weiterverarbeitung auf Basis der interpolierten Attribute im Fragment Shader | ||||
|     \item Beispiel Phong-Shading: Berechnung des Phong-Beleuchtungsmodells auf Basis der vorher linear interpolierten Fragmentnormalen, -position und Materialdaten sowie der Daten der Lichtquellen und Kameraposition | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \subsection{Rasteroperationen} | ||||
|   \begin{itemize*} | ||||
|     \item Abschließende Auswahl/Zusammenfassung der berechneten Fragmentdaten (pro Pixel) | ||||
|     \item Beispiel: nicht transparente Objekte, Übernahme der Farbwerte mit z-Position, welche am dichtesten an der Kamera ist (z-Buffer) | ||||
|     \item Beispiel: transparente Objekte (z.B. Glashaus), lineares Blending zwischen schon existierenden Farbwerten und neuesten entsprechend der Transparenz | ||||
|     \item Beispiel: nicht transparente Objekte, Übernahme der Farbwerte mit z-Position, welche am dichtesten an der Kamera ist | ||||
|     \item Beispiel: transparente Objekte, lineares Blending zwischen schon existierenden Farbwerten und neuesten entsprechend der Transparenz | ||||
|   \end{itemize*} | ||||
|    | ||||
|   \subsection{Performance} | ||||
|   Einfaches Modell zur Bestimmung der Rechenzeit T: | ||||
|   $T = a * \text{Anzahl Vertices} + b * \text{Anzahl Bildpixel}$ (a = Aufwand pro Vertex, b = Aufwand pro Pixel) | ||||
|   $$T = a * \text{Anzahl Vertices} + b * \text{Anzahl Bildpixel}$$ | ||||
|   (a = Aufwand pro Vertex, b = Aufwand pro Pixel) | ||||
|    | ||||
|   \begin{itemize*} | ||||
|     \item Grafikkarten geben ihre Performance an in: | ||||
|     \begin{itemize*} | ||||
|       \item  Anzahl Polygone / Sekunde (Polygone mit kleiner Pixelanzahl) | ||||
|       \item Anzahl Polygone / Sekunde (Polygone mit kleiner Pixelanzahl) | ||||
|       \item Anzahl verarbeitete Pixel / Sekunde | ||||
|       \item  z.B. ca. 100 Millionen Polygone/sec à 10 Pixel / Polygon (mit Texturen, tri-lineare Filterung, etc. mehrere Milliarden Pixel / s (Gouraud Shader) (Angaben: nVidia Geforce 6800 - Jahr 2005) | ||||
|     \end{itemize*} | ||||
|     \item Problem der Grafik-Pipeline: Flaschenhals! - Langsamste Operation hält Pipeline auf (bestimmt Durchsatz) → Zwei extreme Situationen: | ||||
|     \item Problem der Grafik-Pipeline: Langsamste Operation hält Pipeline auf (bestimmt Durchsatz)  | ||||
|     \item $\rightarrow$ Zwei extreme Situationen: | ||||
|     \begin{description*} | ||||
|       \item[Vertex-limited] viele Vertices, kleine Polygone (wenige Pixel), einfache lineare Interpolation der Vertex-Attribute pro Fragment (kleines b ) | ||||
|       \item[Fill rate limited] anspruchsvolle Fragment-Shader (großes b), weniger dafür große Polygone (viele Pixel) | ||||
|     \end{description*} | ||||
|     \item Außerdem: Grafikspeicher-Zugriffe sind teuer (Latenz und Bandbreite beachten) z.B. Auslesen gerenderter Bilder aus dem Grafikspeicher | ||||
|     \item Eine für die Grafikkarte angegebene Performance ist nur unter unrealistisch günstigen Bedingungen zu erreichen. | ||||
|     \begin{itemize*} | ||||
|       \item  Vertex-limited: viele Vertices, kleine Polygone (wenige Pixel), einfache lineare Interpolation der Vertex-Attribute pro Fragment (kleines b ) | ||||
|       \item  Fill rate limited: anspruchsvolle Fragment-Shader (großes b), weniger dafür große Polygone (viele Pixel) | ||||
|     \end{itemize*} | ||||
|     \item Außerdem: Grafikspeicher-Zugriffe sind teuer (Latenz und Bandbreite beachten!) z.B. Auslesen gerenderter Bilder aus dem Grafikspeicher | ||||
|     \item Eine für die Grafikkarte angegebene Performance (z. B. 100 Mio Polygone/sec bei G-Force 6800) ist nur unter unrealistisch günstigen Bedingungen zu erreichen. | ||||
|     \begin{itemize*} | ||||
|       \item  d. h. z.B. nicht 100 Mio. unterschiedliche Polygone mit 1 fps (wegen Speicherbandbreite für Vertexzugriffe) | ||||
|       \item  auch nicht 10.000 Polygone mit 10.000 fps (da Framebuffer-Reset teuer) | ||||
|       \item  Herstellerangaben gelten nur unter optimalen Bedingungen (z. B. 10 Pixel / projiziertem Polygon)! | ||||
|       \item  realistisch (verschieden große Polygone) → ca. 1 Mio Polygone mit 10 fps (10 Mio Polygone/s) = 10\% der Peak Performance! | ||||
|       \item  wegen Speicherbandbreite für Vertexzugriffe | ||||
|       \item  da Framebuffer-Reset teuer | ||||
|       \item  Herstellerangaben nur für optimalen Bedingungen | ||||
|       \item  realistisch $\rightarrow\approx 10\%$ der Peak Performance! | ||||
|     \end{itemize*} | ||||
|   \end{itemize*} | ||||
|    | ||||
| @ -1750,7 +1759,7 @@ | ||||
|     \item inverse Transformation, d.h. indirekte Methode | ||||
|     \item da jedes Pixel im Zielbild B an der Position (k, l) Ausgangspunkt der Rechnung ist, bleibt keines unbelegt | ||||
|     \item keine Löcher mehr! | ||||
|     \item Problem: Auch das Quellbild A ist nur an ganzzahligen Rasterpunkten i,j gegeben. Wie ermittelt man A(x,y) aus den Pixeln A(i,j) im Umfeld von x,y? Wie groß muss das Umfeld sein? → Resamplingproblem (Wiederabtastung) | ||||
|     \item Problem: Auch das Quellbild A ist nur an ganzzahligen Rasterpunkten i,j gegeben. Wie ermittelt man A(x,y) aus den Pixeln A(i,j) im Umfeld von x,y? Wie groß muss das Umfeld sein? $\rightarrow$ Resamplingproblem (Wiederabtastung) | ||||
|   \end{itemize*} | ||||
|    | ||||
|   Lösungsansatz: Rückwärtstransformation der Pixelkoordinaten | ||||
| @ -1784,7 +1793,7 @@ | ||||
|     \begin{itemize*} | ||||
|       \item auch hier entstehen zwar keine Lücken im Zielbild beim Transformieren zusammenhängender Bilder | ||||
|       \item aber beim Sampeln im Originalbild entstehen Aliasing-Artefakte: | ||||
|       \item z.B. Auslassen jedes zweiten Pixels im Originalbild → Zielbild wird uniform weiß (oder schwarz) | ||||
|       \item z.B. Auslassen jedes zweiten Pixels im Originalbild $\rightarrow$ Zielbild wird uniform weiß (oder schwarz) | ||||
|     \end{itemize*} | ||||
|     \item exakte Lösung wäre nur bei doppelter Auflösung möglich | ||||
|     \item jedoch Auflösung im Zielbild begrenzt, gute Näherung muss gefunden werden | ||||
| @ -1839,7 +1848,7 @@ | ||||
|     \item Wir stellen uns bewusst das Bild aus Punkten zusammengesetzt vor, d.h. | ||||
|     \begin{itemize*} | ||||
|       \item wir können von $M * N$ Basisbildern der Dimension $M * N$ ausgehen, in denen jeweils nur ein Pixel den Wert 1 (weiß) besitzt (alle anderen Pixel Schwarz = 0) | ||||
|       \item diese Basisbilder sind damit alle orthonormal → Wichtungsfaktoren durch inneres Produkt! | ||||
|       \item diese Basisbilder sind damit alle orthonormal $\rightarrow$ Wichtungsfaktoren durch inneres Produkt! | ||||
|       \item sie ergeben in der grauwertgewichteten Summe das diskrete Bild F | ||||
|     \end{itemize*} | ||||
|   \end{itemize*} | ||||
| @ -1885,7 +1894,7 @@ | ||||
|       \item Rechts unten: Anteil der höchsten Frequenz | ||||
|     \end{itemize*} | ||||
|     \item Der Cosinus Raum bildet ein Orthonormalsystem | ||||
|     \item ein Pixelbild im Ursprungsraum lässt sich zusammensetzen als gewichtete Addition von Bildern mit unterschiedlichen Frequenzen → Spektralzerlegung | ||||
|     \item ein Pixelbild im Ursprungsraum lässt sich zusammensetzen als gewichtete Addition von Bildern mit unterschiedlichen Frequenzen $\rightarrow$ Spektralzerlegung | ||||
|     \item Ähnlich funktioniert die Fouriertransformation (Sinus und Cosinustransformation) | ||||
|   \end{itemize*} | ||||
|    | ||||
| @ -1929,7 +1938,7 @@ | ||||
|     \item Rekonstruktion eines Signals mittels Interpolation durch Erzeugen weiterer Samples zwischen den gemessenen Samples mittels eines Interpolationsalgorithmus (Supersampling) | ||||
|     \item z.B. durch polynomiale Interpolation (mehrere Nachbarsamples) | ||||
|     \item Dennoch entsteht ein etwas gestörtes Signal (hier nicht harmonische Verzerrung / Modulation) | ||||
|     \item → Aliasing-Effekt, allerdings in abgemildertem Umfang | ||||
|     \item $\rightarrow$ Aliasing-Effekt, allerdings in abgemildertem Umfang | ||||
|   \end{itemize*} | ||||
|    | ||||
|   Bei der eingangs vorgeschlagenen Rückwärtstransformation (vom Zielbild zurück ins Originalbild) ist die Samplingrate durch das Zielbild bestimmt (d.h. ein Sample pro Pixel im Zielbild).  | ||||
| @ -1956,7 +1965,7 @@ | ||||
|     \item Danach Sampling des gefilterten Originalbildes durch inverse Transformation jedes Pixels im Zielbild | ||||
|   \end{itemize*} | ||||
|    | ||||
|   → Die höchsten Frequenzen des Originalbildes können aufgrund der zu geringen Auflösung im Zielbild ohnehin nicht dargestellt werden. Dieser Ansatz findet die beste Lösung unter den gegebenen Umständen.  | ||||
|   $\rightarrow$ Die höchsten Frequenzen des Originalbildes können aufgrund der zu geringen Auflösung im Zielbild ohnehin nicht dargestellt werden. Dieser Ansatz findet die beste Lösung unter den gegebenen Umständen.  | ||||
|    | ||||
|   Achtung! Reihenfolge ist wichtig: Wenn man zuerst sampelt und dann das Zielbild filtert, lässt sich u.U. die Originalinformation (wenn dort Frequenzen oberhalb der Nyquistfrequenz enthalten sind) nicht mehr rekonstruieren! | ||||
|    | ||||
| @ -1974,7 +1983,7 @@ | ||||
|     \item Inverse Transformation der Koordination vom Zielbild + Sampling im Originalbild | ||||
|     \item Bei einer Vergrößerung findet hierbei eine Überabtastung statt (d. h. das Signal im Originalbild liegt unter der halben Nyquistfrequenz der Samplingrate des Zielbildes) | ||||
|     \item Zur genauen Rekonstruktion von Zwischenwerten kann man interpolieren, d.h. ein gewichtetes Mittel zwischen Werten der benachbarten Pixel im Originalbild berechnen | ||||
|     \item Dadurch werden die scharfen (aber ungenau positionierten Flächengrenzen) zwar unscharf... Aber die wahrgenommene Genauigkeit nimmt zu → Antialiasing | ||||
|     \item Dadurch werden die scharfen (aber ungenau positionierten Flächengrenzen) zwar unscharf... Aber die wahrgenommene Genauigkeit nimmt zu $\rightarrow$ Antialiasing | ||||
|     \item Zur Gewichtung können ebenfalls Filterfunktionen im Ortsraum verwendet werden – Cut-off-Frequenz = Nyquistfrequenz im Originalbild (z. B. lineare Interpolation oder Nearest Neighbor, Sinc Funktion, etc.) | ||||
|   \end{itemize*} | ||||
|    | ||||
| @ -1999,8 +2008,8 @@ | ||||
|   \begin{itemize*} | ||||
|     \item $m=(-1,1), n=(-1,1)$ | ||||
|     \item $H=\frac{1}{9} \begin{pmatrix} 1&1&1\\ 1&1&1 \\ 1&1&1 \end{pmatrix}$ | ||||
|     \item einfache Mittelwertbildung der Nachbarpixel → unscharfes Bild und hochfrequente Artefakte | ||||
|     \item Faltungsoperatoren zur Tiefpassfilterung → Beispiel Rauschunterdrückung | ||||
|     \item einfache Mittelwertbildung der Nachbarpixel $\rightarrow$ unscharfes Bild und hochfrequente Artefakte | ||||
|     \item Faltungsoperatoren zur Tiefpassfilterung $\rightarrow$ Beispiel Rauschunterdrückung | ||||
|   \end{itemize*} | ||||
|    | ||||
|   Beispiel Filterfern: 5x5 Binominalfilter | ||||
| @ -2021,7 +2030,7 @@ | ||||
|   \begin{itemize*} | ||||
|     \item Box-Filter | ||||
|     \begin{itemize*} | ||||
|       \item Alle Abtastwerte innerhalb eines um das Pixel gelegte Quadrat (meist mit der Kantenlänge von einem Pixelabstand) haben die gleiche Gewichtung: → Mittelwertbildung | ||||
|       \item Alle Abtastwerte innerhalb eines um das Pixel gelegte Quadrat (meist mit der Kantenlänge von einem Pixelabstand) haben die gleiche Gewichtung: $\rightarrow$ Mittelwertbildung | ||||
|       \item Das Box-Filter liefert im Allgemeinen schlechte Ergebnisse, da seine Fourier-Transformierte eine Sinc-Funktion ist, die den gewünschten Frequenzbereich nur schlecht isoliert | ||||
|     \end{itemize*} | ||||
|      | ||||
| @ -2066,7 +2075,7 @@ | ||||
|     \item Filter zur Hoch- bzw. Bandpassfilterung: | ||||
|     \item Anwendung: z.B. Kantenextraktion | ||||
|     \item Sobelgradient: $H_{xS} =\begin{pmatrix} 1&0&-1\\ 2&0&-2\\ 1&0&-1\end{pmatrix}, H_{yS}=\begin{pmatrix} 1&2&1\\ 0&0&0\\ -1&-2&-1 \end{pmatrix}$ | ||||
|     \item Differenzbildung (Ableitung) → hohe Frequenzen werden verstärkt! | ||||
|     \item Differenzbildung (Ableitung) $\rightarrow$ hohe Frequenzen werden verstärkt! | ||||
|     \item im Gegensatz dazu sind Tiefpassfilter Integralfilter = gewichtete Summe der Nachbarpixel | ||||
|   \end{itemize*} | ||||
|    | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user