V této kapitole se budeme zabývat výsledky vektorové kvantizace, které je zobecněním skalární. Problémem skalární kvantizace je omezený kompresní poměr, kterého lze dosáhnout kompresí jednotlivých pixelů. Proto vektorová kvantizace provádí kompresi po blocích pixelů. Z tohoto důvodu budeme dosahovat lepších kompresních poměrů, za cenu větší kvantizační chyby. Pro maximalizaci kompresního poměru bychom mohli využívat velkých kvantizačních bloků, které by avšak vedly k nadmíru znatelným chybám. Úkolem je tedy vybrat správně velký blok, který nám umožní vytvořit co nejmenší soubory s minimálně znatelnou vizuální chybou.

Co se týče počtu a velikosti slovníků, tak platí stejné informace, které byly uvedeny v přecházející sekci \ref{sec:results_scalar_quantization}. První rozdíl je v Rovnici \ref{eq:vq_cr}, pomocí které se dá vypočítat kompresní poměr vektorové kvantizace bez využití Huffmanova kódování. Tato rovnice platí pro dvoudimenzionální obrazy, kde kvantizační vektory je široké $v_x$ a vysoké $v_y$.

\begin{equation}
    \text{CR}_{vq} = \ddfrac{16L (v_x v_y) + n \left(\bigceil{W / v_x} \bigceil{H / v_y}\right) }{16 W H}
    \label{eq:vq_cr}
\end{equation}

V této práci jsme se zaměřili hlavně na kompresi pomocí vektorů velikosti 9, $N = 9$. Jeden objekt slovníku tedy reprezentuje celkem 9 pixelů v obraze. Vyzkoušeli jsme řádkový vektor rozměrů $9 \times 1$ a maticový vektor $3 \times 3$. Výsledky vektorové kvantizace provedené s vektorem $3 \times 3$ na vybraném řezu nalezneme v Tabulce \ref{tab:drosophila_vq_compression}. Tyto výsledky můžeme srovnat s hodnotami v Tabulce \ref{tab:drosophila_sq_compression}.

\begin{table}[ht!]
    \centering
    \begin{tabular}{r | r | r | r | r}
        \toprule
        $L$   & MSE           & PSNR (dB) & $\text{CR}_{vq}$  & BPP     \\\midrule
        4     & 6419376,3469  & 28,2545   & 0,0139            & 0,2228  \\    
        8     & 2786779,4970  & 31,8784   & 0,0209            & 0,3344  \\    
        16    & 1959095,5248  & 33,4089   & 0,0279            & 0,4467  \\    
        32    & 1271817,9621  & 35,2852   & 0,0350            & 0,5600  \\    
        64    & 911822,9665   & 36,7304   & 0,0422            & 0,6756  \\    
        128   & 627429,8214   & 38,3538   & 0,0497            & 0,7956  \\    
        256   & 471523,5292   & 39,5944   & 0,0578            & 0,9244  \\
    \bottomrule
    \end{tabular}
    \caption{Výsledky vektorové kvantizace $3\times 3$ pro embryo octomilky (Kanál 0)}
    \label{tab:drosophila_vq_compression}
\end{table}

Dle této tabulky se zdá, že kvalita výsledného obrazu je po provedení vektorové kvantizace velmi špatná. PSNR dosahuje v nejlepším případě pouze hodnoty 39,5944 dB, kdežto u skalární kvantizace jsme se dostali až na hodnotu 62,7451 dB. Stejně tak chyba MSE je mnohonásobně vyšší. Na obrázcích, které budou následovat, si vysvětlíme, proč došlo ke vzniku tak velkých chyb. Ještě v této tabulce si všimneme velmi pozitivního posledního sloupce. U všech slovníků jsme se dostali na hodnotu menší než 1 bit na pixel. Vysvětlení nízké hodnoty BPP je jednoduché. Jak jsme již zmínili, jeden blok zastupuje $N$ pixelů a k zakódování obrazu je potřeba mnohem méně bloků, než je pixelů.

Abychom lépe porozuměli chybě, která vzniká vektorovou kvantizací, podíváme se znova na teplotní mapy, které najdeme na Obrázku \ref{fig:vq_hm}. Na prvních třech grafech vidíme, že většinová část chybných pixelů se vyskytuje přímo na buněčné stěně vzorku. Navíc se tyto pixely liší \linebreak o maximální hodnotu teplotní mapy, někdy i víc jak 15 000. Z tohoto můžeme usoudit, že pro aplikaci vektorové kvantizace nebude možné využít slovníku menších nežli 32. Na dalších grafech vidíme, že chyba na pixelech vzorku klesá a teplejší místa se nacházejí spíše v okolí vzorku. Tyto chybné pixely na markerech jsou taky důvodem velmi vysokých hodnot MSE a malé hodnoty PSNR v předcházející tabulce. 

\begin{figure}[h!]
    \centering
    \begin{subfigure}{1\linewidth}
        \centering
        \includegraphics[width=1\linewidth,trim={0 0 0 2cm},clip]{Figures/ch0_400_vq3x31hm.pdf}        
    \end{subfigure}
    \begin{subfigure}{1\linewidth}
        \centering
        \includegraphics[width=1\linewidth,trim={0 0 0 7cm},clip]{Figures/ch0_400_vq3x32hm.pdf}        
    \end{subfigure}
    \caption{Absolutní chyba ve vybraném řezu vektorová kvantizace}
    \label{fig:vq_hm}
\end{figure}

Obecně jsou tyto teplotní mapy více zašuměné, něž tomu bylo u skalární kvantizace. U té byl pixel nahrazován jedním pixelem, kdežto zde je nahrazován v rámci bloku. Stává se tedy, že i když je slovníkový vektor nejblíže bloku obrazu, tak některý pixel nebo pixely mohou být zcela rozlišné. Tento efekt se dá ještě více pozorovat na řádkovém vektoru. U něj si můžeme představit, že se budou bloky v prvních $N-2$ pixelech rovnat a zbylé 2 pixely budou odlišné. \\ Díky tomuto jevu bohužel pozorujeme několik velkých chyb v rámci buněčné stěny embrya octomilky. Avšak v posledním grafu se již největší chyby vyskytují v okolí vzorku na markerech. Tyto objekty nejsou pro člověka důležité, a tudíž se dá tato chyba tolerovat. V budoucí práci by stálo za vyzkoušení provést předzpracování obrazu, které by odstranilo okolí vzorku od vzorku samotného. Samotné snímky po dekompresi najdeme znovu v přílohách na Obrázcích \ref{fig:appendix_vq3x3_result_images_ch0} a \ref{fig:appendix_vq9x1_result_images_ch0}. Při typickém prohlížení obrázku je poměrně náročné vidět vizuální artefakty vzniklé kompresí. Samozřejmě kvalita by se dala zlepšit větším slovníkem nebo menším kvantizačním vektorem.



Histogramem na Obrázku \ref{fig:vq_error_dist} si můžeme potvrdit, že pixely lišící se výrazně od původních pixelů zaujímají menšinovou část v obraze. Nejčetnější jsou opět hodnoty v okolí nuly, tedy minimální rozdíly. Oproti skalární kvantizaci je rozsah chyby v okolí nuly širší. Toto je znovu způsobeno efektem, který jsme zmínili v předcházejícím odstavci. Tento efekt má za důsledek vznik většího počtu malých chyb. Na vedlejším histogramu v Obrázku \ref{fig:vq_value_dist} znovu vidíme distribuci hodnot pixelů po dekompresi. Tyto histogramy už nebudou mít přesně $L$ vrcholů, jak tomu bylo u skalární kvantizace. Což může být výhodou vektorové kvantizace, která je schopna zrekonstruovat více než jen $L$ hodnot jasu. Toto platí díky slovníku, obsahujícího obecně více unikátních hodnot.

\begin{figure} %[ht!]
    \centering
    \begin{subfigure}{.45\textwidth}
        \centering
        \includegraphics[width=.9\linewidth]{Figures/vq3x3_error_hist.pdf}        
        \caption{Histogram vzniklé kvantizační chyby, vektorová kvantizace}
        \label{fig:vq_error_dist}
    \end{subfigure}
    \begin{subfigure}{.45\textwidth}
        \centering
        \includegraphics[width=.9\linewidth]{Figures/vq3x3_value_hist.pdf}        
        \caption{Histogram pixelů po vektorové kvantizaci}
        \label{fig:vq_value_dist}
    \end{subfigure}
    \caption{Distribuce hodnot v obraze po vektorové kvantizaci}
    \label{fig:vq_compression_dist}
\end{figure}

Porovnáme-li statistické výběrové charakteristiky vektorové kvantizace v Tabulce \ref{tab:vq_error_stats}, oproti skalární kvantizaci v Tabulce \ref{tab:sq_error_stats} najdeme několik významných rozdílu. Tyto odlišnosti dále potvrzují naše předchozí tvrzení. Významně větší směrodatná odchylka nám potvrzuje dříve zmíněný širší rozsah hodnot a bohužel taky říká, že tato metoda bude hůře dosahovat ideálního Diracova impulsu. Co se týče tvaru histogramu chyby, tak ten je znovu pozitivně zešikmený, ale jeho špičatost je výrazně vyšší. Jelikož se chyba pixelu počítá rozdílem kvantizovaného pixelu od originálního pixelu, tak kladná hodnota průměru znamená, že běžně je pixel po kvantizaci tmavší. Díky tomu můžeme říct, že při kvantizaci dochází k určité ztrátě jasu, která je avšak při větších slovnících nevýznamná. O normalitě chyby už v tomto případě ani neuvažujeme, \linebreak a to hlavně díky vysoké špičatosti.

\begin{table}[ht!]
    \centering
    \begin{tabular}{r | r | r | r | r | r}
        \toprule
        $L$   & Průměr    & Medián  & Směr. odch.   & Šikmost   & Špičatost \\\midrule
        4     & 30,7036   & -393    & 2533,4640     & 1,9868    & 32,2008   \\    
        8     & 36,0887   & -103    & 1668,9757     & 1,1205    & 80,5539   \\    
        16    & 48,5230   & -46     & 1398,8363     & 0,5664    & 97,0722   \\    
        32    & 13,0592   & -17     & 1127,6740     & 0,4302    & 117,9198  \\    
        64    & 1,7319    & -5      & 954,8931      & -0,0966   & 111,4976  \\    
        128   & 4,7748    & -1      & 792,0907      & -0,0065   & 112,6596  \\    
        256   & 3,9256    & 0       & 686,6648      & 0,0519    & 91,8357   \\
    \bottomrule
    \end{tabular}
    \caption{Výběrové charakteristiky hodnoty chyby vektorové kvantizace}
    \label{tab:vq_error_stats}
\end{table}

Dále si podobně jako v předchozí kapitole probereme průměrné absolutní chyby v rámci všech rovin datasetu. Také srovnáme výsledky individuálního slovníku se slovníkem globálním. Budeme se zabývat kvantizačním vektorem s rozměrem $3 \times 3$, který lépe využívá vlastností obrazů. Grafy MAE pro kanál 0 nalezneme na Obrázku \ref{fig:vq_error_trend} a pro kanál 1 v přílohách na Obrázku \ref{fig:vq_error_trend_ch1}. Prvního, čeho si všimneme oproti skalární kvantizaci je četný výkyv chyby pro nejmenší slovník. Znovu proto potvrzujeme, že 4 různé vektory nestačí na zakódování obrazu, výsledný obraz je nepoužitelný. Hlavní problém je ve tvorbě slovníku, kdy se někdy podaří vybrat \linebreak 4 poměrně dobře reprezentující vektory, avšak v jiných případech budou převládat vektory, které špatně reprezentují komprimovaný obraz. Tyto výkyvy jsou ještě výraznější na grafu \linebreak v Obrázku~\ref{fig:vq_error_trend_ch1}. Obecně platí, že čím je slovník větší, tím je průměrná hodnota chyby podle rovin stabilnější.

Při porovnání si všimneme, že ve všech třech grafech je průměrná chyba nejlepšího slovníku vždy větší, než tomu bylo u skalární kvantizace. Pozitivní je, že globální slovník se znovu ukazuje jako velmi silná technika komprese. Výsledky tohoto typu slovníku jsou nejstabilnější a také nejlepší. Navíc v kanálu 1 je chyba ještě menší. Hodnoty BPP uvedeny v těchto grafech jsou vypočteny bez použití Huffmanova kódování. Dále u prvního grafu jsou BPP větší, protože \linebreak v komprimovaném souboru je uloženo 946 slovníků, oproti jednomu slovníku ve dvou následujících grafech.

\image{vq3x3_error_trend_ch0.pdf}{Průměrná absolutní chyba vektorové kvantizace ($3 \times 3$) podle rovin (Kanál 0)}{fig:vq_error_trend}{1.0}

Samozřejmě i ve vektorové kvantizaci jsme využili Huffmanovo kódování, které opět vedlo ke zlepšení obou parametrů CR i BPP. U této metody ale není vylepšení tak výrazné, jak \linebreak u metody předcházející. Kompresní poměry spolu s rozdílem najdeme v Tabulce \ref{tab:vq_cr_huffman}. Kompresní poměr vektorové kvantizace je už tak velmi dobrý, takže i zlepšení o setiny, jak tomu je u větších slovníků, je velmi výhodné. U BPP jsme byli schopni snížit hodnotu průměrně \linebreak o 0,15 bitů na pixel. Navíc při kompresi datasetu pomocí jednoho globálního slovníku očekáváme výraznější zlepšení BPP.

\begin{table}[ht!]
    \centering
    \begin{tabular}{r | r | r | r | r}
        \toprule
        $L$   & CR     & $\Delta$CR   & BPP    & $\Delta$BPP \\\midrule
        4     & 0,0103 & 0,0036       & 0,1646 & 0,0582      \\    
        8     & 0,0141 & 0,0068       & 0,2254 & 0,1090      \\    
        16    & 0,0194 & 0,0085       & 0,3099 & 0,1368      \\    
        32    & 0,0243 & 0,0107       & 0,3883 & 0,1717      \\    
        64    & 0,0319 & 0,0103       & 0,5104 & 0,1652      \\    
        128   & 0,0372 & 0,0125       & 0,5957 & 0,1999      \\    
        256   & 0,0466 & 0,0112       & 0,7459 & 0,1785      \\
    \bottomrule
    \end{tabular}
    \caption{Kompresní poměr vektorové kvantizace s Huffmanovým kódováním}
    \label{tab:vq_cr_huffman}
\end{table}

Na konci této sekce se ještě podíváme na propustnosti, rychlosti obou implementovaných metod, při použití globálního slovníku. Globální slovník jsme využili, protože jsme chtěli porovnat pouze časy komprese/dekomprese a nebrat v potaz čas potřebný pro naučení slovníku. Čas učení slovníku je výrazně delší u vektorové kvantizace. Výsledky byly změřeny na \linebreak počítači s procesor Intel Core i7-8850H, komprese i dekomprese byla prováděna sériově. \linebreak Naměřené hodnoty jsou uvedeny v Tabulce \ref{tab:sq_vq_speed}. Pomocí SQ značíme skalární kvantizaci a pomocí VQ vektorovou kvantizaci. Dle naměřených hodnot zjišťujeme, že pro obě metody propustnost kompresoru klesá spolu s rostoucím slovníkem. Toto je logické, neboť kompresor musí vyhledat vhodnou slovníkovou hodnotu z většího slovníku, kterou nahradí originální pixel nebo blok pixelů. U vektorové kvantizace je toto zpomalení více dramatické a s každým dalším slovníkem je propustnost dvojnásobně menší. Toto je způsobeno větším počtem porovnání, kdy musí být pro každý vektor porovnáno $N$ hodnot. Oproti tomu v dekompresi je vektorová kvantizace mnohem výkonnější a rychlost klesne až u větších slovníků. Pomalejší rychlost skalární kvantizace je daná metodou nahrazování pixelů postupně po jednom.


\begin{table}[ht!]
    \centering
    \begin{tabular}{l | r | r | r}
        \toprule
        Metoda  & $L$ & Propustnost komprese (MB/s) & Propustnost dekomprese (MB/s) \\\midrule
        SQ      & 4   & 146,3631                    & 203,1817                      \\ 
                & 8   & 115,0506                    & 145,5821                      \\ 
                & 16  & 74,3411                     & 85,8877                       \\ 
                & 32  & 52,6046                     & 58,8911                       \\ 
                & 64  & 42,9385                     & 65,4982                       \\ 
                & 128 & 34,7163                     & 46,0345                       \\ 
                & 125 & 25,6509                     & 38,1008                       \\\midrule
        VQ      & 4   & 82,1126                     & 148,3101                      \\ 
                & 8   & 48,3193                     & 148,7356                      \\ 
                & 16  & 28,5913                     & 144,0050                      \\ 
                & 32  & 15,5943                     & 142,1102                      \\ 
                & 64  & 8,1177                      & 129,0721                      \\ 
                & 128 & 4,2009                      & 119,6165                      \\ 
                & 125 & 2,1162                      & 122,8333                      \\ 
    \bottomrule
    \end{tabular}
    \caption{Porovnání rychlostí skalární a vektorové kvantizace (globální slovník)}
    \label{tab:sq_vq_speed}
\end{table}


Nutno podotknout, že komprese i dekomprese jsou v aktuální době implementovány sériově \linebreak a metody jsou poměrně snadno paralelizovatelné. Oba implementované algoritmy pracují při kompresi a dekompresi pouze s daty aktuální roviny a s konstantním slovníkem, který jim byl předán. Tyto výsledky byly získány zpracováním 250 rovin z datasetu. Můžeme si tedy představit, že při kompresi bude každé vlákno komprimovat každou rovinu zvlášť. Stejné platí pro dekompresi. Navíc je pro nás důležitější rychlost dekomprese, neboť počítáme s tím, že komprese bude prováděna na výkonném serveru nebo superpočítači. Zde mohou být obrazy kódovány za běhu, nebo už mohou být uloženy ve speciálním formátu QCMP. Komprimovaná data budou přenášena \linebreak k uživateli, na jehož počítači bude docházet k dekompresi, která je již nenáročná a rychlá.

\FloatBarrier