Bildverarbeitung_Lausen/Kapitel/04_Vorverarbeitung.tex
2018-11-15 14:47:47 +01:00

294 lines
15 KiB
TeX

\chapter{Bildvorverarbeitung}
\section{Codierung und Kompression}
\subsection{LZW / LZ78}\index{LZW}\index{LZ78}
Der \ac{LZW}-Algorithmus ist die bekannteste Form der LZ78-Kompression.
\autoref{code:lzw} zeigt die Funktionsweise dieses Algorithmus.
\medskip
\begin{lstlisting}[caption={Funktionsweise LZW-Algorithmus},label=code:lzw]
initialisiere Mustertabelle mit (<leeres Muster>+zeichen) für alle Zeichen
muster := <leeres Muster>
solange noch Zeichen verfügbar
zeichen := lies nächstes Zeichen
wenn (muster+zeichen) in Mustertabelle dann
muster := (muster+zeichen)
sonst
füge (muster+zeichen) zur Mustertabelle hinzu
Ausgabe muster
muster := zeichen
wenn muster nicht <leeres Muster> dann
Ausgabe muster
\end{lstlisting}
Die nachfolgende Tabelle komprimiert die Zeichenkette \enquote{\code{LZWLZ78LZ77LZCLZMWLZAP}} mithilfe des \ac{LZW}-Algorithmus.
\begin{tabular}{r|c|c|r}
\textbf{Zeichenkette} & \textbf{gefundener Eintrag} & \textbf{Ausgabe} & \textbf{neuer Eintrag} \\ \midrule
\code{LZWLZ78LZ77LZCLZMWLZAP} & L & L & LZ (wird zu <256>) \\
\code{ZWLZ78LZ77LZCLZMWLZAP} & Z & Z & ZW (wird zu <257>) \\
\code{WLZ78LZ77LZCLZMWLZAP} & W & W & WL (wird zu <258>) \\
\code{LZ78LZ77LZCLZMWLZAP} & LZ (= <256>) & <256> & LZ7 (wird zu <259>) \\
\code{78LZ77LZCLZMWLZAP} & 7 & 7 & 78 (wird zu <260>) \\
\code{8LZ77LZCLZMWLZAP} & 8 & 8 & 8L (wird zu <261>) \\
\code{LZ77LZCLZMWLZAP} & LZ7 (= <259>) & <259> & LZ77 (wird zu <262>) \\
\code{7LZCLZMWLZAP} & 7 & 7 & 7L (wird zu <263>) \\
\code{LZCLZMWLZAP} & LZ (= <256>) & <256> & LZC (wird zu <264>) \\
\code{CLZMWLZAP} & C & C & CL (wird zu <265>) \\
\code{LZMWLZAP} & LZ (= <256>) & <256> & LZM (wird zu <266>) \\
\code{MWLZAP} & M & M & MW (wird zu <267>) \\
\code{WLZAP} & WL (= <258>) & <258> & WLZ (wird zu <268>) \\
\code{ZAP} & Z & Z & ZA (wird zu <269>) \\
\code{AP} & A & A & AP (wird zu <270>) \\
\code{P} & P & P & -
\end{tabular}
Die Ausgabe wäre somit \code{L Z W <256> 7 8 <259> 7 <256> C <256> M <258> Z A P}.
\subsection{Huffman (Entropiekodierung)}\index{Huffman}\index{Entropie}
Die Huffman-Kodierung ist eine verlustfreie Entropiekodierung, die eine Kompression um den Faktor $\sim{3}$ ermöglicht. Dabei ist er ein präfixfreier Code. In seiner einfachsten Implementierung werden die vorkommenden Zeichen nach ihrer Häufigkeit sortiert. Das am häufigsten vorkommende Zeichen erhält die Kodierung \code{1}, das zweithäufigste \code{01}, das dritthäufigste \code{001}, usw.
\autocap{fig:huffman} zeigt eine Huffman-Tabelle, wie sie zur Kodierung verwendet werden kann.
\begin{figure}[h]
\begin{center}
\begin{tabular}{r|c|c}
Codierung & Zeichen & Häufigkeit \\ \midrule
\code{1} & E & 10\% \\
\code{01} & A & 9\% \\
\code{001} & M & 6\% \\
\code{0001} & \ldots &
\end{tabular}
\end{center}
\caption{Huffmantabelle -- Einfachste Implementierung}
\label{fig:huffman}
\end{figure}
\begin{Hinweis}
Herr Lausen hat nach obigem Muster die Huffman Kodierung vorgenommen. Hierbei handelt es sich um eine sehr ineffiziente Art, Huffman zu verwenden. An dieser Stelle sei auf andere Vorlesungen\footnote{\url{http://www.ziegenbalg.ph-karlsruhe.de/materialien-homepage-jzbg/cc-interaktiv/huffman/codierung.htm}} verwiesen, die dieses Thema ausführlicher behandeln.
\end{Hinweis}
\subsection{Lauflängenkodierung}\label{sec:rlc}\index{Lauflängenkodierung}
Die \enquote{Lauflänge} an gleicher Zeichen, also die Anzahl aufeinanderfolgender gleicher Zeichen wird gespeichert. Verwendet wird dies \ua beim Fax. Aus \code{SSSSSWWWWWWWSSS} wird hierdurch \code{5 7 3}.
Bei natürlichen Bilder kann dies auch sinnvoll sein, da der Himmel \zB eine ähnliche Helligkeit besitzt (siehe \autoref{sec:jpeg}).
\section{JPEG}\label{sec:jpeg}\index{JPEG}
\ac{JPEG} ist ein Format zum Speichern \textit{natürlicher} Bilder.
Bei üblichen Bildern werden pro Pixel drei Farben (rot, grün, blau) gespeichert, wodurch sich pro Pixel ein Speicherbedarf von 24~Bit ergibt. Gute Scanner verwenden pro Subpixel sogar 16~Bit und damit 48~Bit pro Pixel.
\subsection{Konvertierung in ein geeignetes Farbmodell}\index{Farbraum}
\begin{wrapfigure}{r}{5cm}
\centering
\includegraphics[width=5cm]{./Bilder/JPEG_YCbCr.png}
\caption[RGB Alternative -- YCbCr]{\unskip}
RGB Alternative -- YCbCr
\label{fig:jpeg_YCbCr}
\end{wrapfigure}
Anstatt pro Pixel 24~Bit zu speichern, kann der RGB Farbraum auch nach YCbCr umgewandelt werden. Nehmen wir $4\times 4$ Pixel:
Es wird die Helligkeit Y (für Gamma) für jedes Pixel abgespeichert, zusätzlich kommt noch 1~Byte für die Farbkomponente Cb (Blue-Yellow Chrominance) und 1~Byte für Cr (Red-Green Chrominance) hinzu.\index{YCbCr}
Wie sich aus \autoref{fig:jpeg_YCbCr} ergibt, werden somit anstatt $3\times 4\times 8=96$~Bit nur $6\times 8=48$~Bit gespeichert, was eine Speicherverbesserung von 50\% mit sich bringt.
\autoref{fig:ycbcr_anschaulich} veranschaulicht die Unterteilung in diese Farben. Anstatt des YCbCr Farbraums wird oft auch YUV verwendet.\index{YUV}
Y ist dabei wieder die Luminanz und U und V bilden den eigentlichen Farbwert. \autoref{fig:yuv_anschaulich} veranschaulicht dies.
\begin{figure}[h]
\centering
\begin{subfigure}[b]{5cm}
\includegraphics[width=5cm]{./Bilder/Barn_grand_tetons_rgb_separation.jpg}
\caption{RGB - Original, R, G, B}
\label{fig:rgb_anschaulich}
\end{subfigure}
\begin{subfigure}[b]{5cm}
\includegraphics[width=5cm]{./Bilder/320px-Barns_grand_tetons_YCbCr_separation.jpg}
\caption{YCbCr - Original, Y, Cb, Cr}
\label{fig:ycbcr_anschaulich}
\end{subfigure}
\begin{subfigure}[b]{5cm}
\includegraphics[width=5cm]{./Bilder/320px-Barn-yuv.png}
\caption{YUV - Original, Y, U, V}
\label{fig:yuv_anschaulich}
\end{subfigure}
\caption{Farbräume visualisiert}
\end{figure}
.....\todo{Berechnung Farbwerte}
\subsection{Diskrete Kosinustransformation}\index{DCT}
\begin{wrapfigure}[6]{r}{5cm}
\centering
\includegraphics[width=5cm]{./Bilder/DCT.png}
\caption[\acl{DCT}]{\unskip}
\acf{DCT}
\label{fig:dct}
\end{wrapfigure}
\ac{JPEG} unterteilt das Bild in $8\times 8$ Pixel große Subbilder. \ac{DCT}\todo{DCT, Formeln...}
\subsection{Quantisierung}
% Von https://www.tu-chemnitz.de/informatik/ThIS/downloads/courses/ws02/datkom/JPEG_Kompression.pdf
\begin{align*}
\hat{G}^q_{uv} = INT[\frac{G_{uv}}{q_{uv}}] \\
q_{uv} = \begin{bmatrix}
1 & 2 & 4 & \cdot & \cdot & \cdot \\
2 & 1 & 4 & \cdot & \cdot & \cdot \\
2 & 8 & 8 & \cdot & \cdot & \cdot \\
\cdot & \cdot & \cdot & 1 & \cdot & \cdot \\
\cdot & \cdot & \cdot & \cdot & 1 & \cdot \\
\cdot & \cdot & \cdot & \cdot & \cdot & 0
\end{bmatrix}
\end{align*}
In den meisten Bildern sind viele Koeffizienten nahezu 0. Setzt man diese zu 0, dann ist dies nach der Dekompression kaum bemerkbar! Weiterhin sind einige Koeffizienten wichtiger als andere!
So ist \zB die Grundhelligkeit und der Helligkeitsverlauf am wichtigsten (niedrige Frequenzen).
Weniger wichtig ist die Textur des Bildes (mittlere Frequenzen).
Sehr feine hochfrequente Details sind nahezu nicht beobachtbar und unwichtig.
Die Koeffizienten werden also durch unterschiedlich starke Quantisierung \enquote{gleich wichtig} gemacht.
Die Quantisierung erfolgt mit einer Quantisierungsmatrix $q$ (siehe Formel oben). Jeder Koeffizient der DCT-Matrix wird durch einen entsprechenden Wert (aus der Quantisierungsmatrix) geteilt.
Es gibt keine vorgeschriebenen Standardtabellen für Quantisierungsmatrizen.
Somit lässt sich die Bildqualität über die Quantisierung steuern.
Dies hat zur Folge, dass die genutzte Quantisierungsmatrix im Bild mit transportiert werden muss, um es an anderer Stelle wieder dekodieren zu können.
Dies erhöht zwar den Speicherbedarf, aber erhöht auch die Flexibilität des Standards und wird somit ohne weiteres geduldet.
Ist $q_{uv}$ überall 1, dann hat das Bild die beste Qualität, da die Amplituden unverändert bleiben.
\textbf{Beispiel}
\begin{align*}
\hat{G}_{uv} &= 31 \\
q_{uv} &= 8 \\
INT[\frac{G_{uv}}{q_{uv}}] &= 3 \rightarrow Dekodierung: 3\times 8 = 24=G_{uv}
\end{align*}
\todo{Müsste das Abrunden sein?}
\subsection{Serialisierung der Matrix}
\begin{wrapfigure}{r}{5cm}
\centering
\includegraphics[width=5cm]{./Bilder/Jpeg_Serialisierung.png}
\caption[Serialisierung der Matrix in der Zig-Zag-Ordnung]{\unskip}
Serialisierung der Matrix in der Zig-Zag-Ordnung
\label{fig:jpeg_serialisierung}
\end{wrapfigure}
% Stammt aus: https://www.tu-chemnitz.de/informatik/ThIS/downloads/courses/ws02/datkom/JPEG_Kompression.pdf
Die DC-Koeffizienten (Matrixinhalt an Position $1,1$) benachbarter Blöcke unterscheiden sich nur wenig und werden daher als Differenz zum Vorgängerblock übertragen.
Die Koeffizienten werden im Zick-Zack angeordnet, was gleichzeitig einer Anordnung nach Ihrer Wichtigkeit entsprechend der visuellen Wahrnehmung entspricht. \autoref{fig:jpeg_serialisierung} stellt dies dar.
\subsection{RLC (Lauflängenkodierung)}
Anschließend folgt eine Lauflängenkodierung der serialisierten Matrix. Das funktioniert aufgrund der langen Nullketten sehr gut. Siehe \autoref{sec:rlc} und die vorhergehende Matrix.
\subsection{Huffman-Kodierung}
Es ergibt sich, dass die Huffman-Tabelle sehr klein ist.
Natürliche Bilder haben in jedem $8\times 8$ Block Helligkeit. Schmeißen wir dies raus, dann funktioniert RCL und Huffman gut \todo{Wie meinte er das?}
\subsection{Kantenerkennung bei JPEG}
\todo{Grafik Diagram}
\subsection{JPEG 2000}\index{JPEG 2000}
JPEG 2000 ist eine erweiterte Version von JPEG. Sie verspricht eine bessere Qualität bei geringen Bitraten.
Anstatt der \ac{DCT} werden Wavelets verwendet und anstatt der Huffman Kodierung wird eine arithmetische verwendet.
Es gibt keine fest Blockgröße für die Wavelet-Transformation.
Trotz dieser Unterschiede ist die Bildqualität nicht zwingend besser als bei JPEG. Sie macht sich nur bei starker Kompression bemerkbar.
\subsection{Moire Effekt bei JPEG}\index{Moire}
Wenn ein Bild mehrere Male als JPEG mit unterschiedlichen Quantisierungsmatrizen gespeichert wird, so ergeben sich Artefakte, die dem Moirè Effekt ähnlich sind.
\section{Analogien eines Bildes}
\subsection{Histogramm}\index{Histogramm}
Man kann in einem Histogramm den Mittelwert der Grauwerte, die Anzahl der Einträge, die Streuung, die Anzahl der vorkommenden Helligkeitsklassen und die Spannweite ablesen.
\medskip
\begin{Hinweis}
Zu sagen, ein \enquote{Histogramm zeige die Häufigkeiten von Grauwerten} ist falsch!
Dies wurde von Herrn Lausen \textit{mehrmals} in aller Deutlichkeit erwähnt. Korrekt ist:
\enquote{Ein Histogramm ist die Darstellung der Besetzungshäufigkeit von Helligkeitsklassen in einem Bild.}
\end{Hinweis}
\subsubsection{Histogramm bei RGB}
Die einzelnen Farbkanäle können auch dazu verwendet werden, Objekte aufgrund ihrer Farbe zu identifizieren.
Somit ergibt sich für jede der drei Farben ein Histogramm, wie in \autoref{fig:histogramm_rgb} zu sehen ist.
\begin{figure}[h!]
\centering
\includegraphics[width=\textwidth]{./Bilder/Histogramm-RGB.png}
\caption{Histogramm RGB}
\label{fig:histogramm_rgb}
\end{figure}
\subsection{Gammakorrektur}\index{Gamma}
\begin{wrapfigure}[10]{l}{8cm}
\centering
\vspace{-11mm}
\includegraphics[width=8cm]{./Bilder/Gamma.png}
\caption{Gammakorrektur}
\label{fig:gamma}
\end{wrapfigure}
Das menschliche Auge sieht logarithmisch.
Dies bedeutet, dass eine Verdopplung der Helligkeit nicht gleich einer Verdopplung der wahrgenommenen Helligkeit entspricht.
Die Gamma-Korrektur spreizt die Grauwerte in dem oberen oder unteren Wertebereich und staucht sie dafür in dem jeweils anderen.
In \autoref{fig:gamma} ist eine solche Korrektur abgebildet.
Die x-Achse repräsentiert das Originalbild $I$ und die y-Achse das veränderte $I' = I^\gamma$. Bei $\gamma < 1$ wird das Bild heller, bei $\gamma > 1$ wird es dunkler. Diese Umrechnung funktioniert nur, wenn die Werte im Bereich $[0, 1]$ liegen. Somit besteht die vollständige Umrechnung aus:
\vspace{-9mm}
\begin{align*}
I_{\gamma}' = INT[(\frac{I}{I_{max}})^\gamma\cdot I_{max}]
\end{align*}
\vspace{-10mm}
\subsection{Kontrast}\index{Kontrast}
\begin{wrapfigure}[9]{r}{8cm}
\centering
\vspace{-6mm}
\includegraphics[width=8cm]{./Bilder/Kontrast.png}
\caption{Kontrastspreizung}
\label{fig:kontrast}
\end{wrapfigure}
Als Kontrast wird die Spannweite zwischen maximalem und minimalem Helligkeitswert bezeichnet.
Kontrast kann man \enquote{spreizen}, \dash die Minimal- und Maximalwerte heraufsetzen.
\autoref{fig:kontrast} zeigt ein Bild mit unterschiedlichen Kontrasten (vor und nach Spreizung).
Sei $[a_{min}, a_{max}]$ der zu spreizende Bereich, so lässt sich das neue Bild berechnen mit:
\qquad $I'=f(I)=INT[\frac{I-a_{min}}{a_{max}-a_{min}}\cdot I_{max}]$
Diese Operation ist eine homogene \acf{PO} und kann effizient mit einer \acf{LUT} berechnet werden.
\subsection{Dynamik}\index{Dynamik}
\begin{wrapfigure}[9]{r}{8cm}
\centering
\vspace{-6mm}
\includegraphics[width=8cm]{./Bilder/Dynamik.png}
\caption{Dynamik eines Bildes}
\label{fig:dynamik}
\end{wrapfigure}
Die Dynamik eines Bildes gibt an, wie viele Grauwertklassen besetzt sind.
Obwohl der Kontrast groß ist ($I_{max} - I_{min}$) kann die Dynamik variieren.
In \autoref{fig:dynamik} sind im rechten Bild nur wenige Grauwerte besetzt. Man sagt, das Bild hat wenig Dynamik.
Natürliche Bilder haben meist eine hohe Dynamik und keine \enquote{Lücken}. An diesen kann man \ua bearbeitete
Bilder erkennen.
\subsection{Einfluss JPEG-Konvertierung}
\begin{wrapfigure}[6]{r}{8cm}
\centering
\vspace{-3cm}
\includegraphics[width=8cm]{./Bilder/Kompressionseinfluss.png}
\caption{Kompressionseinfluss}
\label{fig:Kompressionseinfluss}
\end{wrapfigure}
Eine Kompression kann auf das Histogramm Einfluss haben. Ein Bild mit nur einem Grauwert hat nach der Dekompression plötzlich deutlich mehr Grauwerte im Histogramm. Dies liegt an der Funktionsweise von JPEG mit \ac{DCT}.
\section{LSI-Filter}\index{LSI-Filter}
In der Bildverarbeitung werden häufig \ac{LSI}-Filter verwendet (z)u deutsch \enquote{lineare Verschiebungsinvarianz}).
\begin{Tipp}[frametitle={Faltung}]
\vspace{-5mm}
\begin{align*}
Kommutativität&& \mathcal{H}_1\mathcal{H}_2&=\mathcal{H}_2\mathcal{H}_1 \\
Assoziativität&& (\mathcal{H}_1\mathcal{H}_2)\mathcal{H}_3 &= \mathcal{H}_1(\mathcal{H}_2\mathcal{H}_3) \\
Distributivität &&(\mathcal{H}_1+\mathcal{H}_2)\cdot\mathcal{H}_3&=\mathcal{H}_1\mathcal{H}_3+\mathcal{H}_2\mathcal{H}*3
\end{align*}
\end{Tipp}
\begin{align*}
\mathcal{H}^{mn}\mathcal{S} &= {}^{mn}\mathcal{S}\mathcal{H}
\end{align*}
\includepdf[pages=-]{2018-10-31.pdf}