\chapter{Bildvorverarbeitung} \section{Codierung und Kompression} \subsection{title}{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 (+zeichen) für alle Zeichen 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 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} \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} \subsubsection{Diskrete Kosinustransformation}\index{DCT} \begin{wrapfigure}[6]{r}{5cm} \centering \includegraphics[width=5cm]{./Bilder/DCT.png} \caption{\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...} \subsubsection{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?} \subsubsection{Serialisierung der Matrix} \begin{wrapfigure}{r}{5cm} \centering \includegraphics[width=5cm]{./Bilder/Jpeg_Serialisierung.png} \caption{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. \subsubsection{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. \subsubsection{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?} \subsubsection{Kantenerkennung bei JPEG} \todo{Grafik Diagram} \section{JPEG 2000} \section{Moire Effekt bei JPEG} Wenn ein Bild mehrere Male als JPEG mit unterschiedlichen Quantisierungsmatrizen gespeichert wird, so ergeben sich Artefakte, die dem Moire Effekt ähnlich sind.