184 lines
10 KiB
TeX
184 lines
10 KiB
TeX
|
\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 (<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}
|
||
|
\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.
|