Update
1
.gitignore
vendored
|
@ -1,5 +1,6 @@
|
||||||
# Verzeichnisse
|
# Verzeichnisse
|
||||||
Mitschriften/
|
Mitschriften/
|
||||||
|
*.app
|
||||||
|
|
||||||
# Dateien
|
# Dateien
|
||||||
*_Mitschrift.tex
|
*_Mitschrift.tex
|
||||||
|
|
BIN
2018-10-31.pdf
Normal file
7
Bilder/.directory
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
[Dolphin]
|
||||||
|
Timestamp=2018,11,5,19,0,42
|
||||||
|
Version=4
|
||||||
|
ViewMode=1
|
||||||
|
|
||||||
|
[Settings]
|
||||||
|
HiddenFilesShown=true
|
BIN
Bilder/3-CCD.png
Normal file
After Width: | Height: | Size: 236 KiB |
BIN
Bilder/320px-Barn-yuv.png
Normal file
After Width: | Height: | Size: 328 KiB |
BIN
Bilder/320px-Barns_grand_tetons_YCbCr_separation.jpg
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
Bilder/Barn_grand_tetons_rgb_separation.jpg
Normal file
After Width: | Height: | Size: 1 MiB |
BIN
Bilder/Bayer_Maske.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
Bilder/Bayer_Maske_2.png
Normal file
After Width: | Height: | Size: 81 KiB |
BIN
Bilder/CCD_Elemente.png
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
Bilder/CCD_Grafik.png
Normal file
After Width: | Height: | Size: 923 KiB |
BIN
Bilder/CCD_Physik.png
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
Bilder/CCD_Sensor.png
Normal file
After Width: | Height: | Size: 166 KiB |
BIN
Bilder/DCT.png
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
Bilder/Farbe.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
Bilder/JPEG_YCbCr.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
Bilder/Jpeg_Serialisierung.png
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
Bilder/Sensor_Beleuchtung.jpg
Normal file
After Width: | Height: | Size: 101 KiB |
BIN
Bilder/Sensor_Durchleuchtung.png
Normal file
After Width: | Height: | Size: 98 KiB |
|
@ -33,11 +33,20 @@
|
||||||
% Mitschriften
|
% Mitschriften
|
||||||
\input{Kapitel/00_Vorwort.tex}
|
\input{Kapitel/00_Vorwort.tex}
|
||||||
\input{Kapitel/01_Einstieg.tex}
|
\input{Kapitel/01_Einstieg.tex}
|
||||||
|
\input{Kapitel/02_Einleitung.tex}
|
||||||
|
\input{Kapitel/03_Bilderfassung.tex}
|
||||||
|
\input{Kapitel/04_Farbsysteme.tex}
|
||||||
|
\input{Kapitel/05_Codierung.tex}
|
||||||
|
|
||||||
%------- Sonstiges ---------------------------------------------------
|
%------- Sonstiges ---------------------------------------------------
|
||||||
|
|
||||||
\chapter{Abkürzungsverzeichnis}
|
\chapter{Abkürzungsverzeichnis}
|
||||||
\begin{acronym}[xxxxxxxx]
|
\begin{acronym}[xxxxxxxx]
|
||||||
|
\acro{dpi}{dots per inch}
|
||||||
|
\acro{CCD}{Charge Coupled Device}
|
||||||
|
\acro{DCT}{Diskrete Kosinustransformation}
|
||||||
|
\acro{JPEG}{Joint Photographic Experts Group}
|
||||||
|
\acro{LZW}{Lempel-Ziv-Welch}
|
||||||
\end{acronym}
|
\end{acronym}
|
||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
|
|
168735
Buecher/Digitale_Bilderverarbeitung-Bernd_Jhne.pdf
Normal file
BIN
Buecher/Digitale_Bildverarbeitung-BurgerBurge.pdf
Normal file
5
Code/README.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
# Code für Plugins
|
||||||
|
|
||||||
|
Den Ordner "plugins" kopieren nach "ImageJ.app"
|
||||||
|
|
||||||
|
Die Java Klasse muss in einer Datei mit dem gleichen Namen liegen. Auch muss die Datei in einem Ordner mit dem gleichen Namen liegen.
|
69
Code/plugins/Gamma_2018_10_24/Gamma_2018_10_24.java
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
import ij.ImagePlus;
|
||||||
|
|
||||||
|
import ij.plugin.filter.PlugInFilter;
|
||||||
|
|
||||||
|
import ij.process.ImageProcessor;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a template for a plugin that requires one image to
|
||||||
|
* be opened, and takes it as parameter.
|
||||||
|
*/
|
||||||
|
public class Gamma_2018_10_24 implements PlugInFilter {
|
||||||
|
protected ImagePlus image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method gets called by ImageJ / Fiji to determine
|
||||||
|
* whether the current image is of an appropriate type.
|
||||||
|
*
|
||||||
|
* @param arg can be specified in plugins.config
|
||||||
|
* @param image is the currently opened image
|
||||||
|
* @see ij.plugin.filter.PlugInFilter#setup(java.lang.String, ij.ImagePlus)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public int setup(String arg, ImagePlus image) {
|
||||||
|
this.image = image;
|
||||||
|
/*
|
||||||
|
* The current return value accepts all gray-scale
|
||||||
|
* images (if you access the pixels with ip.getf(x, y)
|
||||||
|
* anyway, that works quite well.
|
||||||
|
*
|
||||||
|
* It could also be DOES_ALL; you can add "| NO_CHANGES"
|
||||||
|
* to indicate that the current image will not be
|
||||||
|
* changed by this plugin.
|
||||||
|
*
|
||||||
|
* Beware of DOES_STACKS: this will call the run()
|
||||||
|
* method with all slices of the current image
|
||||||
|
* (channels, z-slices and frames, all). Most likely
|
||||||
|
* not what you want.
|
||||||
|
*/
|
||||||
|
return DOES_8G | DOES_16 | DOES_32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is run when the current image was accepted.
|
||||||
|
*
|
||||||
|
* @param ip is the current slice (typically, plugins use
|
||||||
|
* the ImagePlus set above instead).
|
||||||
|
* @see ij.plugin.filter.PlugInFilter#run(ij.process.ImageProcessor)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void run(ImageProcessor ip) {
|
||||||
|
int k = 256;
|
||||||
|
int aMax = k -1;
|
||||||
|
double gamma = 2.8;
|
||||||
|
// bauen uns eine LUT (Look-Up-Table)
|
||||||
|
int[] lut = new int[k];
|
||||||
|
|
||||||
|
for (int a = 0; a < k; ++a) {
|
||||||
|
double aa = ((double) a) / aMax;
|
||||||
|
double bb = Math.pow(aa, gamma);
|
||||||
|
int b = (int) Math.round(bb*aMax);
|
||||||
|
lut[a] = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
ip.applyTable(lut);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
1
Code/plugins/readme.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
User plugins go here.
|
BIN
JPEG_Kompression.pdf
Normal file
|
@ -1,23 +1,17 @@
|
||||||
\chapter{Einstieg in die Vorlesung}
|
\chapter{Einstieg in die Vorlesung}
|
||||||
|
|
||||||
\begin{tabular}{ll}
|
\begin{tabular}{ll}
|
||||||
Dozent: & Ralph Lausen \\
|
Dozent: & Ralph Lausen \\
|
||||||
Modul: & Computergraphik und Bildverarbeitung (T2INF4303) \\
|
Mobil: & 0176-24652134 \\
|
||||||
Fach: & Digitale Bildverarbeitung
|
Modul: & Computergraphik und Bildverarbeitung (T2INF4303) \\
|
||||||
|
Fach: & Digitale Bildverarbeitung \\
|
||||||
|
Moodle & \url{https://moodle.dhbw.de/course/view.php?id=61} \\
|
||||||
|
Klausur: & 90min
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
|
\section{Buchempfehlungen}
|
||||||
\section{Bildverarbeitung (Vorlesung)}
|
|
||||||
|
|
||||||
\begin{itemize}[noitemsep]
|
\begin{itemize}[noitemsep]
|
||||||
\item Klausur: 90min
|
\item Grundlagen der Bildverarbeitung (Klaus D. Tönnies)
|
||||||
|
\item Digitale Bildverarbeitung (Bernd Jähne)
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\section{Übersicht}
|
|
||||||
\begin{enumerate}[noitemsep]
|
|
||||||
\item Bilderfassung
|
|
||||||
\item Vorverarbeitung
|
|
||||||
\item Segmentierung
|
|
||||||
\item Merkmalsextraktion
|
|
||||||
\item Klassifizierung
|
|
||||||
\end{enumerate}
|
|
||||||
|
|
29
Kapitel/02_Einleitung.tex
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
\chapter{Einführung}
|
||||||
|
|
||||||
|
\section{Einsatzgebiete}
|
||||||
|
Bildverarbeitung wird mittlerweile in nahezu allen Wissenschafts- und Ingenieursdisziplinen eingesetzt, wie beispielsweise in der modernen Mikroskopie, medizinischen Diagnostik, Astronomie, Maschinenbau und in der Fernerkundung (Umweltbeobachtung, Spionage). Mit Methoden der Bildverarbeitung werden in Maschinen Objekte gezählt, vermessen, Objekte inspiziert oder codierte Informationen gelesen. Röntgen- und Ultraschallgeräte liefern mit der Bildverarbeitung Bilder, die der Arzt einfacher deuten kann. Röntgengeräte in Sicherheitszonen untersuchen Gepäck und Kleidung automatisch nach gefährlichen Objekten (Waffen etc.).
|
||||||
|
|
||||||
|
Im Gegensatz zur Bildbearbeitung, welche sich mit der Manipulation von Bildern zur anschließenden Darstellung beschäftigt, umfasst die Bildverarbeitung weitergehende Bearbeitungsprozeduren zur Extraktion von Information aus den Ursprungsdaten: \zB Bewegungsbestimmung, Bildsegmentierung, Bilderkennung und Mustererkennung.
|
||||||
|
|
||||||
|
\hspace*{4mm} -- Ralph Lausen, Moodle Raum
|
||||||
|
|
||||||
|
%Notizen: Roter Luftballon absorbiert rotes Licht
|
||||||
|
|
||||||
|
\bigskip
|
||||||
|
\begin{Hinweis}[frametitle={Womit beschäftigt sich die Bildverarbeitung?}]
|
||||||
|
Mit \textit{natürlichen} Bildern.
|
||||||
|
|
||||||
|
Dies wurde von Herrn Lausen mehrmals erwähnt, da viele Studenten in der Klausur
|
||||||
|
vergessen \enquote{natürlich} zu erwähnen. Deshalb an dieser Stelle der Hinweis, dass
|
||||||
|
wir uns in der Vorlesung \enquote{Bildverarbeitung} mit \textit{natürlichen} Bildern beschäftigen.
|
||||||
|
\end{Hinweis}
|
||||||
|
|
||||||
|
\section{Ablauf der Bildverarbeitung}
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Bilderfassung
|
||||||
|
\item Vorverarbeitung
|
||||||
|
\item Segmentierung
|
||||||
|
\item Merkmalsextraktion
|
||||||
|
\item Klassifikation
|
||||||
|
\end{enumerate}
|
||||||
|
|
103
Kapitel/03_Bilderfassung.tex
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
\chapter{Bilderfassung}
|
||||||
|
|
||||||
|
\section{Natürliche Bilder}
|
||||||
|
|
||||||
|
Eine Beleuchtungsfunktion sit analog, kontinuierlich/stetig, sodass Intensität $I(x,y) \rightarrow$ 2D, kontinuierlich. Ein Sensor erfasst ein Bild und digitalisiert es, wodurch wir eine diskrete Funktion $g(m,n)$ erhalten.
|
||||||
|
|
||||||
|
\subsection{Sensoren}
|
||||||
|
Die Auflösung eines Sensors wird in \acs{dpi} (Punkte pro Länge) angegeben.
|
||||||
|
Wir unterscheiden zwischen:
|
||||||
|
|
||||||
|
\columnratio{0.4}
|
||||||
|
\begin{paracol}{2}
|
||||||
|
\begin{itemize}[noitemsep]
|
||||||
|
\item \textbf{Durchleuchtung} (z.B. Röntgen, \autoref{fig:durchleuchtung})
|
||||||
|
\begin{itemize}[noitemsep]
|
||||||
|
\item Absorption
|
||||||
|
\item Streuung
|
||||||
|
\item Rückstreuung
|
||||||
|
\item Rauschen
|
||||||
|
\end{itemize}
|
||||||
|
\item \textbf{Beleuchtung} (\autoref{fig:beleuchtung})
|
||||||
|
\begin{itemize}[noitemsep]
|
||||||
|
\item Reflektion
|
||||||
|
\item Schatten
|
||||||
|
\item Oberflächen
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\switchcolumn
|
||||||
|
\begin{figure}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=40mm]{./Bilder/Sensor_Durchleuchtung.png}
|
||||||
|
\end{center}
|
||||||
|
\caption{Sensor -- Durchleuchtung (Röntgen)}
|
||||||
|
\label{fig:durchleuchtung}
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=40mm]{./Bilder/Sensor_Beleuchtung.jpg}
|
||||||
|
\end{center}
|
||||||
|
\caption{Sensor -- Beleuchtung}
|
||||||
|
\label{fig:beleuchtung}
|
||||||
|
\end{figure}
|
||||||
|
\end{paracol}
|
||||||
|
|
||||||
|
|
||||||
|
\subsection{Sensor: CCD (Charge Coupled Device)}
|
||||||
|
|
||||||
|
Ein \ac{CCD} Sensor ist ein Halbleiter Bildsensor bestehend aus eine großen Anzahl an fotosensitiven Elementen (Zellen/Pixeln). Meist wird Silizium als Halbleiter verwendet. \autoref{fig:ccd_physik} zeigt die Physik hinter diesem Sensor.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=\textwidth - 4cm]{./Bilder/CCD_Physik.png}
|
||||||
|
\end{center}
|
||||||
|
\caption{CCD -- Physik}
|
||||||
|
\label{fig:ccd_physik}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Jedes Element (Pixel) sammelt elektrische Ladungen, die durch das Absorbieren von Photonen (also des einfallenden Lichts) erzeugt wird. Dies ist möglich, da die Photonen Elektronen des P-Dotierten Halbleiters vom Valenz- ins Leitungsband heben. Hierdurch entstehen Elektronen-Loch-Paare. Diese Ladungen werden nacheinander von Sensorelement zu Sensorelement über den Chip in einen mit schwarzer Folien abgedeckten Bereich transportiert (Stichwort Interline-CCD-Sensor). Dieser dient dazu, die Informationen zu schützen während sie ausgelesen werden.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=\textwidth - 5cm]{./Bilder/CCD_Elemente.png}
|
||||||
|
\end{center}
|
||||||
|
\caption{CCD -- Gitter}
|
||||||
|
\label{fig:ccd_gitter}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Es ist anzumerken, dass \ac{CCD} Sensoren anfällig sind für verschiedene Arten von Rauschen:
|
||||||
|
|
||||||
|
\begin{itemize}[noitemsep]
|
||||||
|
\item Photonenrauschen $n(\gamma) \sim n(e)\pm\sqrt{n(e)}$ \newline
|
||||||
|
(poissonverteilt; Verbesserung durch gute Beleuchtung)
|
||||||
|
\item \acs{CCD} Rauschen / Dunkelstromrauschen: Elektronen lösen sich ungewollt durch Wärmeeinfluss (Verbesserung durch Kühlen)
|
||||||
|
\item Verstärker-Rauschen (Verbesserung durch geringere Verstärkung)
|
||||||
|
\item Quantisierungs-Rauschen (Analog/Digital)
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
Wie können nun Farben auf dem \ac{CCD} unterschieden werden? Bei 1-CCD kann hierfür eine sogenannte Bayer-Maske verwendet werden\index{Bayer-Maske}, wie in \autoref{fig:bayer_maske} dargestellt. Bei dieser Maske ist jedes Pixel in 4 Subpixel eingeteilt, zwei davon grün und eins jeweils blau und rot. Hierdurch wird das einfallende Licht gefiltert und es ist möglich, Farben zu messen und zu speichern (siehe \autoref{sec:Farbsysteme}).
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=6cm]{./Bilder/Bayer_Maske_2.png}
|
||||||
|
\end{center}
|
||||||
|
\caption{CCD -- Bayer Maske}
|
||||||
|
\label{fig:bayer_maske}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Dies führt uns zur Pixellüge: Bei 4~Mio. Pixel sind 2~Mio. grün, 1~Mio. rot und 1~Mio. blau. Es gibt somit doppelt so viele grüne wie rote und blaue Pixel.
|
||||||
|
|
||||||
|
Die andere Variante ist 3-CCD, wie in \autoref{fig:drei_ccd} gezeigt wird. Hierbei gibt es drei Sensoren, die jeweils für eine der Farben rot, blau und grün zuständig sind.
|
||||||
|
|
||||||
|
\begin{figure}[h]
|
||||||
|
\begin{center}
|
||||||
|
\includegraphics[width=\textwidth-4cm]{./Bilder/3-CCD.png}
|
||||||
|
\end{center}
|
||||||
|
\caption{3-CCD}
|
||||||
|
\label{fig:drei_ccd}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
Was sollten wir Lernen?
|
||||||
|
TODO
|
||||||
|
CCD Sensor, PhotoEffekt, Photonenrauschen (Poisson Statistik),, Phononen/CCD Rauschen, Verstärker/Quantisierungsrauschen, Bayer Maske,
|
||||||
|
|
8
Kapitel/04_Farbsysteme.tex
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
\chapter{Farbsysteme}\label{sec:Farbsysteme}
|
||||||
|
|
||||||
|
Farben
|
||||||
|
|
||||||
|
TODO: Andre Grafik 5
|
||||||
|
|
||||||
|
rgba <--> cmyk
|
||||||
|
|
184
Kapitel/05_Codierung.tex
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
\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.
|