Skip to content
Snippets Groups Projects
document.tex 24.8 KiB
Newer Older
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\documentclass[a4paper,12pt]{article}

\usepackage[czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{listings}
\usepackage{hyperref}
\usepackage{enumitem}
\usepackage{mathrsfs}
\usepackage{enumitem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{graphicx}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\usepackage{tikz}
\usepackage{pgfplots}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\usepackage{dirtytalk}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\usepackage{siunitx}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
%\usepackage{titlesec}
%\newcommand{\sectionbreak}{\clearpage}
%\setlist{nosep}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\newcommand{\image}[4]{\begin{figure}[h!] \centering \includegraphics[width=#1\linewidth]{figures/#2} \caption{#4} \label{#3} \end{figure}}
\newcommand{\bThreed}{B$^3$D }
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\pgfplotsset{
Vojtěch Moravec's avatar
Vojtěch Moravec committed
	compat=1.9, 
Vojtěch Moravec's avatar
Vojtěch Moravec committed
	width=7cm,
	/pgfplots/ybar legend/.style={
    /pgfplots/legend image code/.code={%
       \draw[##1,/tikz/.cd,yshift=-0.25em]
        (0cm,0cm) rectangle (3pt,0.8em);},
   }
}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\pgfplotsset{%
    axis line origin/.style args={#1,#2}{
        x filter/.append code={ % Check for empty or filtered out numbers
            \ifx\pgfmathresult\empty\else\pgfmathparse{\pgfmathresult-#1}\fi
        },
        y filter/.append code={
            \ifx\pgfmathresult\empty\else\pgfmathparse{\pgfmathresult-#2}\fi
        },
        xticklabel=\pgfmathparse{\tick+#1}\pgfmathprintnumber{\pgfmathresult},
        yticklabel=\pgfmathparse{\tick+#2}\pgfmathprintnumber{\pgfmathresult}
    }
}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\author{Moravec Vojtěch}
\title{Metody komprese bioinformatických dat pro přenos na HPC infrastrukturu}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\date{2018/2019}

\begin{document}
\maketitle
\newpage

\section{Úvod}
\textit{TODO}
\newpage
Vojtěch Moravec's avatar
Vojtěch Moravec committed

\section{ZISRAW (CZI) formát}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
Vše co bude v této sekci uvedeno vychází z oficiální specifikace formátu CZI \cite{czi_spec}, společnosti Carl Zeiss ZEN software. 

Formát CZI je určen pro ukládání obrazů a metadat, které popisují jak samotný obraz tak i způsob získání obrazů, například v jakých podmínkách byl snímek získán. 
CZI vychází z obecnějšího formátu ZISRAW, jehož hlavním cílem je umožnit streamování velkých dat a metadat v binární podobě. Metadata jsou ukládány ve formátu XML
s kódováním UTF-8. Metadata v souberech CZI vycházejí ze specifikace OME (Open Microscopy Environment) \cite{omeweb}.

Struktůra ZISRAW/CZI formátu byla navržena tak, aby dovolovala streamování velkého množství dat, proto se ZISRAW/CZI soubory skládají ze segmentů.
Každý segment je identifikován svou hlavičkou, která obsahuje informace o jaký segment se jedná a jaká je jeho velikost. Za hlavičkou následuje část s daty. 
V souboru nalezneme speciální segmenty, které fungují jako adresáře pro segmenty s obrazy a přílohami. 
Tyto adresáře odkazují na pozice v souboru, kde se nachází požadované segmenty, což umožňuje načítání pouze těch částí, které jsou potřeba.

Obrazy se nacházejí v segmentech, označené jako \mbox{ZISRAWSUBBLOCK}. Kromě samotných pixelů zde najdeme i metadata, specifické pro daný obraz.
Specifickými metadaty mohou být např. minimální a maximální hodnoty pixelů, počet bitů na pixel a seznam dvojic klíč/hodnota, udávající libovolnou informaci o obrazu (datum pořízení, pozice mikroskopu v \SI{}{\micro\metre}).


Formát CZI dovoluje různé typy pixelu, jak pro barevné tak i černobílé obrazy, seznam všech podporovaných typů najdeme v Tabulce \ref{tab:pixelTypes}.
Vojtěch Moravec's avatar
Vojtěch Moravec committed

\begin{figure}[h!]
    \centering
    \begin{tabular}{| l | c | l |}
        \hline
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        Typ                 & Byte/Pixel    &  Poznámka \\\hline
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        Gray8               &     1         &  8 bit unsigned            \\\hline
        Gray16              &     2         &  16 bit unsigned   \\\hline
        Gray32Float         &     4         &  32 bit IEEE float   \\\hline
        Bgr24               &     3         &  3 $\times$ 8 bit unsigned   \\\hline
        Bgr48               &     6         &  3 $\times$ 16 bit unsigned   \\\hline
        Bgr96Float          &     12        &  3 $\times$ IEEE float   \\\hline
        Bgra32              &     4         &  4 $\times$ 8 bit unsigned   \\\hline
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        Gray64ComplexFloat  &     8         &  2 $\times$ IEEE float   \\\hline
        Bgr192ComplexFloat  &     24        &  8 $\times$ IEEE float   \\\hline
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        Gray32              &     4         &  32 bit signed \textit{planovaný} \\\hline
        Gray64              &     8         &  64 bit float \textit{planovaný} \\\hline
    \end{tabular}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \caption{Tabulka podporovaných typů pixelu v CZI}
    \label{tab:pixelTypes}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\end{figure}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
Informaci o typu pixelu nalezneme v metadatech, které jsou společné pro všechny obrazy nacházející se v CZI souboru. 
Mimo typ pixelu, nalezneme v těchto společných vlastnostech další zajímavé informace, některé jsou uvedeny v Tabulce \ref{tab:imageMetadata}, 
nutno podotknout, že soubor nemusí tyto informace obsahovat.
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\begin{figure}[h!]
    \centering
    \begin{tabular}{| l | l |}
        \hline
        Klíč                & Význam \\\hline
        SizeX               & Šířka obrázku \\\hline
        SizeY               & Výška obrázku \\\hline
        SizeC               & Počet kanálů \\\hline
        SizeZ               & Počet řezů ve směru Z \\\hline
        SizeT               & Počet časových bodů \\\hline
        SizeH               & Počet fází \\\hline
        SizeR               & Počet různých úhlu, ze kterých byl obraz získán \\\hline
        SizeS               & Počet různých scén \\\hline
        SizeI               & Počet různých nasvícení \\\hline
        SizeM               & Počet dílů mozaiky \\\hline
        SizeB               & Počet snímání jednoho obrazu \\\hline
        SizeV               & Počet různých pohledů \\\hline
        PixelType           & Typ pixelu \\\hline
        Dimensions          & Dodatečné informace k dimenzím \\\hline
    \end{tabular}
    \caption{Základní informace o obrazech v souboru CZI}
    \label{tab:imageMetadata}
\end{figure}

Šířka, výška obrázku, počet kanálů, řezů, fází atd. to vše jsou \say{dimenze} obrázku, pro které mohou být uvedeny dodatečné informace. Taktéž, kanály se mohou lišit
typem pixelu, počtem bitů na komponentu, metodou získaní atd., proto i pro ně najdeme specifická metadata.

Data pixelu mohou být v CZI souborech jak komprimovaná tak nekomprimovaná. Specifikací jsou povolené komprese
LZW, JPEG a JPEG-XR. Všechny tyto komprese jsou specifikací omezeny na 2D obrazy. LZW je bezztrátová komprese a momentálně se nepoužívá pro
širokopásmovou mikroskopii. JPEG je ztrátová komprese a JPEG-XR je modernější variantou JPEG, která nabízí lepší kompresní poměry a také bezztrátovou kompresi.

\newpage
\section{Kompresní metody}
V této sekci si popíšeme kompresní metody, které jsme vyzkoušeli na bioinformatických datech. 
Nejprve uvedeme 3 metody, které se používají pro bezztrátovou kompresi dat všech druhů a se staly \emph{de facto} standardem. 
Následně popíšeme kompresi \bThreed, která se přímo zaměřuje na kompresi obrazů, získaných z mikroskopů. 
Také zde prozkoumáme techniku přeuspořádání dat, která by mohla vést k lepším výsledkům komprese.
Vojtěch Moravec's avatar
Vojtěch Moravec committed
Komprese budou hodnoceny pomocí kompresního poměru, který je vypočten následovně:
\begin{equation*}
    \text{kompresní poměr} = \frac{\text{velikost dat}}{\text{velikost komprimovaných dat}}
\end{equation*}
\noindent žádoucí jsou tedy hodnoty větší než $1.0$.

\subsection{Standartní metody}

Standartní metody, které zde uvedeme, jsou hojně využívány v nejrozšířeněšjších programech zabývající se bezztrátovou kompresí. Tyto metody jsou navrženy tak,
aby byly nezávislé na typy procesoru, operačním systému nebo souborovém systému. Tato nezávislost dovoluje přenesitelnost mezi různými stroji. 

Soubory jsou komprimací převáděny do jiných formátů, zaobalující komprimovaná data. Příkladem může být jeden z jednodušších formátů a to \emph{gzip} \cite{gzip},
používá se například i pro HTTP kompresi. Tento formát využívá zřejmě nejrozšířeněšjší 
metodu komprese DEFLATE \cite{deflate_spec}. DEFLATE kombinuje algoritmus LZ77 \cite{LZ77} and Huffmanovo kódování. 
DEFLATE je nejpouživanějším typem komprese v \emph{zip} souborech.

LZMA algoritmus kombinuje více druhů algoritmů, LZ77 \cite{LZ77}, aritmetické kódování a využívá Markuv model predikce. Tento algoritmus se využívá v programu
\emph{7-Zip}.

Třetí algoritmem je bzip2, stejně jako LZMA využívá více metod, Run-Length kódování, Huffmanovo kódování a Block-Sorting kompresi \cite{block_sorting}.

Vojtěch Moravec's avatar
Vojtěch Moravec committed
V následujících grafech porovnáme uvedené 3 metody. Všechny 3 algoritmy dovolují nastavit určitou úroveň komprese, obecně platí, že vetší úroveň znamená
vyšší kompresní poměr, ale také větší paměťové a časové nároky. Né vždy je tedy nejlepším řešením použít maximální úroveň, obvykle 9. 
Následující testy byly provedeny nad CZI souborem, který obsahoval 39 řezů žabronožky, řez je uložen v obrazu $1388 \times 1040$ pixelů, kde typ pixelu je Gray16,
tedy 2 byty pro každý pixel, rozmezí hodnot $0 - 65535$.

\begin{figure}[h!]
    \centering
    % \pgfplotsset{scaled x ticks=false}
        \begin{tikzpicture}
        \begin{axis}[
            width=0.8\linewidth,
            xlabel = {Úroveň komprese},
            ylabel = {Kompresní poměr},
            domain=1:9,
            legend entries = {gzip, lzma, bzip2},
            legend pos = outer north east,
            ymin=2, ymax=4,
            ]
            \addplot[red, thick] table{data/artemia_gzip_level.dat};
            \addplot[blue, thick] table{data/artemia_lzma_level.dat};
            \addplot[green, thick] table{data/artemia_bzip2_level.dat};
        \end{axis}
        \end{tikzpicture}
    \caption{Průměrný kompresní poměr pro jednotlivé úrovně}
    \label{fig:comp_level_comp}
\end{figure}

Na Obrázku \ref{fig:comp_level_comp} vidíme, že pro metody gzip a bzip2 nehraje kompresní úroveň velkou roli a naopak lzma algoritmus vydává lepší
výsledky od úrovně 5. Také vidíme, že pro kompresi daných snímků žabronožky je nejlepší metoda gzip. Uvedené kompresní poměry jsou průměrem přes
Vojtěch Moravec's avatar
Vojtěch Moravec committed
všechn 39 řezů. Na následujícím Obrázku \ref{fig:basic_compression_plot} si porovnáme algoritmy na více souborech, uvedené kompresní poměry jsou průměrem přes 
Vojtěch Moravec's avatar
Vojtěch Moravec committed
všechny snímky v souboru a kompresní úroveň 6.

\begin{figure}[h!]
    \centering
    \begin{tikzpicture}
        \begin{axis}[
        width=0.8\linewidth,
		height=0.55\linewidth,
        xbar,
        enlargelimits=0.25,
        ytick = data,
        xlabel={Kompresní poměr},
        legend pos = outer north east,
        symbolic y coords={{Artemia},{Artemia Flash}, {LLC Emerald}, {16 Bit Z Stack}},
        nodes near coords,
        ]
        % gzip
        \addplot coordinates {
        (2.67797,{Artemia})
        (1.84856,{Artemia Flash})
        (1.40943,{LLC Emerald})
        (1.47818,{16 Bit Z Stack})
        };
        % lzma
        \addplot coordinates {
            (3.46118,{Artemia})
            (2.3531,{Artemia Flash})
            (1.64554,{LLC Emerald})
            (1.80586,{16 Bit Z Stack})
        };
        % bzip2
        \addplot coordinates {
            (3.62971,{Artemia})
            (2.47042,{Artemia Flash})
            (1.72,{LLC Emerald})
            (1.90709,{16 Bit Z Stack})
        };
        \legend{gzip,lzma,bzip2}
        \end{axis}
    \end{tikzpicture}
    \caption{Srovnání kompresí mezi více soubory, úroveň komprese 6}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \label{fig:basic_compression_plot}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\end{figure}

% NOTE: This graph is misleading because the jumps in compression ratios are results of different image channels. In conclusion
%       this plot is not saying anything interesting.
% Pokud se podíváme na kompresi jednotlivých snímků v grafu na Obrázku \ref{fig:frame_compression}, vídíme, že hodnota poměru je různá pro každý
% snímek a obě metody dosahují horších výsledků pro stejné snímky, cca. snímky 25 až 75. Toto je pravda i pro metodu lzma, ale pro přehlednost, 
% jsme jí v grafu vynechali.

% \begin{figure}[h!]
%     \centering
%         \begin{tikzpicture}
%         \begin{axis}[
%             width=0.8\linewidth,
%             xlabel = {Snímek},
%             ylabel = {Kompresní poměr},
%             legend entries = {gzip, bzip2}, %lzma
%             legend pos = outer north east
%             ]
%             \addplot[red, thick ]   table{data/llc_gzip_by_frame.dat};
%             %\addplot[blue, thick] table{data/llc_lzma_by_frame.dat};
%             \addplot[green, thick ]      table{data/llc_bzip_by_frame.dat};
%         \end{axis}
%         \end{tikzpicture}
%     \caption{Komprese jednotlivých snímků}
%     \label{fig:frame_compression}
% \end{figure}
Vojtěch Moravec's avatar
Vojtěch Moravec committed

V Tabulce \ref{tab:compressionTable} uvadíme ještě shrnutí kompresí jednotlivých souborů, pro úroveň komprese 6.
Uvádíme zde bity na pixel, což je průměrný počet bitů potřebný k zakódování informace o jednom pixelu. Jak jsme již uvedli,
všechny tyto soubory obsahují pixely typu Gray16, takže původně bylo potřeba $16$ bitů pro uložení jednoho pixelu. Dalé zde uvádíme
rychlost, nebo také propustnost kompresní metody, tento údaj ja měřen bez jakékoliv paralelizace komprese. Z tabulky vychází jako
nejlepší metoda bzip2, která nabízí nejlepší kompresní poměry a narozdíl od metody lzma není tak pomalá.

\begin{figure}[h!]
    \centering
    \begin{tabular}{ l  l | r r  r }
        Metoda  & Soubor            & Kompresní poměr   & Bity na pixel & Rychlost [MB/s]  \\\hline\hline
        gzip    & Artemia           & 2.678             & 5.998       & 8.064       \\
                & Artemia Flash     & 1.849             & 8.657       & 8.630       \\
                & LLC Emerald       & 1.409             & 11.417      & 7.085       \\
                & 16 Bit Z Stack    & 1.478             & 10.853      & 14.170      \\\hline
        lzma    & Artemia           & 3.461             & 4.634       & 1.683       \\
                & Artemia Flash     & 2.353             & 6.802       & 0.704       \\
                & LLC Emerald       & 1.646             & 9.814       & 1.846       \\
                & 16 Bit Z Stack    & 1.806             & 8.884       & 2.149       \\\hline
        bzip2   & Artemia           & 3.630             & 4.412       & 13.491      \\
                & Artemia Flash     & 2.470             & 6.477       & 7.789       \\
                & LLC Emerald       & 1.720             & 9.383       & 12.788      \\
                & 16 Bit Z Stack    & 1.907             & 8.401       & 13.107      \\
    \end{tabular}
    \caption{Statistiky komprese}
    \label{tab:compressionTable}
\end{figure}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
\newpage
\subsection{Mortonovo kódování}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
Mortonovo kódování, je způsob mapování multidimenzionálních dat na jednodimenzionální. Jedná se o přeuspořádání dat podle \emph{Z křivky}, která jimi
prochází. \emph{Z křivka} spadá do skupiny tzv. prostor vyplňujících křívek, které obecně prochází každým bodem prostoru v $n$-dimenzionální hyperkrychli.
Na Obrázků \ref{fig:zCurve} můžeme vidět jak probíhá mapování 2D prostoru na 1D prostor, pro každý bod roviny je vypočtena $Z$ souřadnice, 
Vojtěch Moravec's avatar
Vojtěch Moravec committed
pomocí které následně seřadíme jednotlivé body. $Z$ souřadnice je vypočtena prolnutím bitů $X$-ové a $Y$-ové souřadnice. 
Vojtěch Moravec's avatar
Vojtěch Moravec committed
V našem případě pomocí $Z$ souřadnice přeuspořádáme data obrazů. Podobný způsob přeuspořádání dat se používá pro ukládání textůr na
grafických kartách, kde toto indexování vede k optimalizaci přístupů do paměti.

\image{0.5}{ZCurve.pdf}{fig:zCurve}{Mortonovo kódování}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
V grafu na Obrázku \ref{fig:z_order_compression_plot}, můžeme vidět změnu kompresního poměru, vzhledem k výsledkům v grafu \ref{fig:basic_compression_plot}.
Naměřené výsledky jsou znovu průměrem přes všechny snímky s úrovní komprese 6. 
Mortonovo kódování se nejvíce vyplatilo pro metody GZIP a LZMA, kde pozorujeme nějvětší nárost v kompresním poměru. Naopak pro metodu bzip2 nemělo
Vojtěch Moravec's avatar
Vojtěch Moravec committed
přeuspořádání dat smysl, neboť naměřené kompresní poměry jsou o něco horší než původní.

Vojtěch Moravec's avatar
Vojtěch Moravec committed
\begin{figure}[h!]
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \begin{tikzpicture}
        \begin{axis}[
            ybar,
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            ylabel = {Rozdíl v kompresním poměru},
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            width=0.8\linewidth,
            symbolic x coords={{Artemia},{Artemia Flash}, {LLC Emerald}, {16 Bit Z Stack}},
            legend pos = outer north east,
            x tick label style={
Vojtěch Moravec's avatar
Vojtěch Moravec committed
                rotate=45,
Vojtěch Moravec's avatar
Vojtěch Moravec committed
                anchor=east,
            },
            xtick=data,
            ]
            % gzip
            \addplot coordinates {
            ({Artemia},0.15945)
            ({Artemia Flash},0.17179)
            ({LLC Emerald},0.02069)
            ({16 Bit Z Stack},0.01711)
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            };
            % lzma
            \addplot coordinates {
                ({Artemia},0.12075)   
                ({Artemia Flash},0.11741)
                ({LLC Emerald},0.03672)
                ({16 Bit Z Stack},0.03480)
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            };
            % bzip2
            \addplot coordinates {
                ({Artemia},-0.00565)
                ({Artemia Flash},0.01913)
                ({LLC Emerald},-0.00177)
                ({16 Bit Z Stack},-0.02083)
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            };
            \legend{gzip,lzma,bzip2}
        \end{axis}
    \end{tikzpicture}
    \caption{Komprese dat, přeuspořadaných podle \emph{Z křivky}}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \label{fig:z_order_compression_plot}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\end{figure}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
\subsection{Komprese rozdílu}
Jak již bylo dříve zmíněno, v jednom CZI souboru se nachází více snímků. Tyto snímky se většinou liší časem pořízení nebo "hloubkou řezu" tzv. Z indexem.
Z této informace můžeme usoudit, že nasledující snímek, nebude od předchozího zcela jiný, pokud oba náleží do stejného kanálu (Různé kanály v CZI souburu obsahují zcela rozdílné obrazy).
Označme si právě kódovaný snímek jako $I_i$, a snímek jemu předcházející jako $I_{i-1}$, rozdíl neboli $\Delta I$ je definována následovně:
\begin{equation*}
    \Delta I = I_i - I_{i-1}
\end{equation*}
K získání snímku $I_i$ by nám tedy stačil pouze předcházející snímek a rozdíl $\Delta I$. Nejčastěji jsou obrazy z mikroskopu uloženy v 16 bitech na pixel.
$\Delta I$ může obsahovat i záporné hodnoty, a proto potřebujeme 32 bitů pro rozdíl jednoho pixelu. Toto by samo o sobě vedlo k dvojnásobné velikosti potřebné
pro uložení rozdílu. Avšak podíváme-li se frekvenci hodnot v Obrázku \ref{fig:diff_freq}, zjístíme, že by jsme mohli záporná čísla namapovat na kladná a použít
ještě méně než originálních 16 bitů.

\begin{figure}[h!]
    \begin{tikzpicture}
        \begin{axis}[ 
            width=0.8\linewidth,
            xlabel = {Hodnota rozdílu},
            ylabel = {Frekvence hodnoty},
            xmin=-500,
            xmax=500,
            x tick label style={rotate=45,anchor=east}
            ]
            \addplot[const plot,fill=blue!30!white,draw=none] table [x, y, col sep=semicolon] {data/16bit_average_histo.histo};
        \end{axis}
    \end{tikzpicture}

    \caption{Frekvece hodnot v rozdílu dvou snímků}
    \label{fig:diff_freq}
\end{figure}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
První typ mapování, který jsme vyzkoušeli je velmi jednodnuchý. Všechny záporné hodnoty posuneme za maximální kladnou hodnotu a následně zjístíme počet bitů, potřebný k zakódování nejvyšší namapované hodnoty. Aby mělo toto mapování smysl musí být počet bitů menší než originálních 16 bitů, neboli hodnota musí být
menší než $65 536 \text{neboli} (1\ll16)$.
Vojtěch Moravec's avatar
Vojtěch Moravec committed
V grafu na Obrázku \ref{table:bits_used} můžeme pozorovat průměrný počet bitů, potřebný k zakódování rozdílu mezi dvěma snímky. Pro každý rozdíl
používáme minimální potřebný počet bitů, aby jsme co nejvíce zmenšili velikost dat. Vzniklé byty následně komprimujeme námi zkoušenými algoritmy
gzip, lzma a bzip2. Mapování do méně bitů je tedy metoda \emph{pre-processingu} dat před samotnou kompresí, kterým také zmenšíme velikost.
Vojtěch Moravec's avatar
Vojtěch Moravec committed

\begin{figure}[h!]
    \begin{tikzpicture}
        \begin{axis}[
            width=0.8\linewidth,
            height=0.55\linewidth,
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            xbar,            
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            enlargelimits=0.2,
            xlabel={Počet bitů},
            symbolic y coords={{Artemia},{Artemia Flash}, {LLC Emerald}, {16 Bit Z Stack}},
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            nodes near coords,
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            ]
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        % BITS USED
Vojtěch Moravec's avatar
Vojtěch Moravec committed
        \addplot coordinates {
            (10.54386,{16 Bit Z Stack})
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            (12.25728,{LLC Emerald})
            (12.36842,{Artemia Flash})
            (08.23684,{Artemia})
Vojtěch Moravec's avatar
Vojtěch Moravec committed
            };
        \end{axis}
    \end{tikzpicture}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \label{table:bits_used}
Vojtěch Moravec's avatar
Vojtěch Moravec committed
    \caption{Průměrný počet bitů pro mapování rozdílu}
\end{figure}

Vojtěch Moravec's avatar
Vojtěch Moravec committed
Samo o sobě vypadá tento \emph{pre-processing} nadějně, neboť u některých obrázků ušetříme až 7 bitů na jednom pixelu. Problémem je ale to,
že najednou ukládáme do jednoho bytu informace i více číslech. Ukazuje se, že toto je problém pro testované algoritmy, neboť ty vydávají lepší výsledky
když nejsou data takhle předzpracovaná. Rozdíly kompresních poměrů vzhledem k výsledkům v grafu \ref{fig:basic_compression_plot} můžeme vidět v tabulce
\ref{table:difference_compression_table}.
Vojtěch Moravec's avatar
Vojtěch Moravec committed
% TODO: BSDIFF.
Vojtěch Moravec's avatar
Vojtěch Moravec committed
\begin{figure}[h!]
    \centering
    \begin{tabular}{ l  l | r r r }
        Metoda  & Soubor            & Pevných 16 bitů & Proměnlivý počet bitů   & bsdiff    \\\hline\hline
        gzip    & Artemia           & -0.206          &  0.056	                & N/A       \\
                & Artemia Flash     & -0.102          & -0.210                  & N/A       \\
                & LLC Emerald       & -0.040          &  0.008                  & N/A       \\
                & 16 Bit Z Stack    &  0.033          &  0.152                  & N/A       \\\hline
        lzma    & Artemia           & -0.289          & -0.499                  & N/A       \\
                & Artemia Flash     & -0.187          & -0.487                  & N/A       \\
                & LLC Emerald       & -0.060          & -0.205                  & N/A       \\
                & 16 Bit Z Stack    & -0.010          & -0.150                  & N/A       \\\hline
        bzip2   & Artemia           & -0.479          & -0.659                  & -0.56762  \\
                & Artemia Flash     & -0.293          & -0.527                  & -0.05141  \\
                & LLC Emerald       & -0.103          & -0.242                  & -0.00099  \\
                & 16 Bit Z Stack    & -0.044          & -0.204                  &  0.00227  \\
    \end{tabular}
    \caption{Změna kompresních poměrů pro kódování rozdílu mezi snímky}
    \label{table:difference_compression_table}
\end{figure}
Vojtěch Moravec's avatar
Vojtěch Moravec committed

\newpage
\subsection{Komprese pomocí knihovny \bThreed}
Tato sekce vychází z \cite{Balazs164624}, taktéž grafy jsou přebrány z této práce.
\bThreed  je Open Source knihovna, řešící problém komprese obrazů z mikroskopu. Je napsána v jazyce C++ a využívá CUDA architekturu. 
Slibovaná rychlost komprese je více než 1 GB/s. Tato knihovna nabízí jak ztrátovou tak i bezztrátovou kompresi, kde ztrátová zohledňuje fakt,
že se jedná o obrazy z mikroskopu a uživatel si může zvolit maximální chybu, kterou bude tolerovat.
Autoři knihovny definuji tzv. WNL (\emph{within noise level}) mód ztrátové komprese, kde kvantizační krok je roven šumu v obraze. 
V tomto módu je chyba, vzniklá ztrátovou kompresí, mnohem menší než šum nacházející se v obraze.
Kompresní poměry bezztrátové a WNL komprese můžeme vídět na Obrázku \ref{img:compressionComp}.

\image{0.65}{compressionComparsionBars.pdf}{img:compressionComp}{Porovnání kompresních poměrů různých vzorků}

Vliv ztrátové komprese na obraz byl testován na datasetu embrya octomilky obecné, metodou segmentačního překrývání. Byl testován komprimovaný obraz s originálním
obrazem, a hodnota 1 znamená, že se obrazy dokonale překrývají. V grafu na Obrázku \ref{img:segoverlap}, můžeme vidět, že překryv klesá až při velkých 
kompresních poměrech. Překryv pro WNL mód je téměř dokonalý 0,996.

\image{0.65}{noise_overlap.pdf}{img:segoverlap}{Vliv ztrátové komprese na kvalitu obrazu}

Použitý bezztrátový algoritmus se skládá ze dvou částí. V první části se provede predikce hodnoty pixelu vzhledem k hodnotám jeho sousedních pixelů a v 
druhé části jsou chyby predikce zakódovány pomocí RLE a Huffmana. 

Bezztrátová komprese dosáhla kompresního poměru 2,7 kdežto ztrátová WNL komprese dosahuje kompresního poměru 5. Chyba lokalizace jediné molekuly v obrazu vstoupla pouze o 4\%. (Bylo testováno na datasetu získaném pomocí Single-Molecule Localization Microscopy, rozlišení 2-25 nm).

Vojtěch Moravec's avatar
Vojtěch Moravec committed
\bibliography{citations}
\bibliographystyle{ieeetr}
Vojtěch Moravec's avatar
Vojtěch Moravec committed

\end{document}