SPIHT

SPIHT (Set Partitioning in Hierarchical Trees) je kvantovací algoritmus navržený pro aplikaci na koeficienty vzniklé pyramidovým rozkladem vlnkovou transformací. V roce 1996 jej publikovali výzkumníci Amir Said a William A. Pearlman.[1] SPIHT vychází z algoritmu EZW (Embedded Zerotree Wavelet), který dále zdokonaluje.

Z praktičtějšího úhlu pohledu se jedná o algoritmus, který progresivně ukládá vlnkové koeficienty do toku bitů. Při dekódování tohoto toku se koeficienty postupně zpřesňují. Jeho práci lze tedy kdykoli přerušit a kvalita uložených koeficientů odpovídá doposud vyprodukovanému výstupu.

Algoritmus při svém postupu zohledňuje spojitost mezi koeficienty na různých úrovních rozkladu. Rozložený signál je na každé úrovni reprezentován dvojnásobným množstvím koeficientů v každém rozměru než na úrovni předchozí (směrem od kořene k listům). Vlnkové koeficienty jsou mezi sousedními měřítky (rozlišeními) silně korelovány. Lze na nich vypozorovat, že hodnota každého koeficientu bude s velkou pravděpodobností menší než hodnota jeho předchůdce. Tohoto faktu využíval již algoritmus EZW. SPIHT je sice implementačně náročnější, při stejné kvalitě však dosahuje kratšího výstupního toku bitů. Existují i různé modifikace tohoto algoritmu.

Prostorové stromy

Strom vlnkových koeficientů.

Algoritmus SPIHT pracuje s tzv. prostorovými stromy (spatial orientation trees). Jedná se o datovou strukturu reprezentující vlnkové koeficienty. Strom začíná kořenem. V případě jednorozměrného signálu má každý uzel dva následníky. U dvourozměrného obrazu bude mít každý uzel následníky čtyři. Listy reprezentují nejvyšší frekvence.

Příklad

Vlnkovou transformací jednorozměrného diskrétního signálu o osmi vzorcích vznikne strom koeficientů , kde je stejnosměrná složka a s 1 ≤ ≤ 7 jsou výstupy horních propustí (dále jen AC koeficienty, indexy 4–7 značí nejvyšší frekvence). Vyjma stejnosměrné složky lze koeficienty reprezentovat stromem jako na obrázku vpravo.

V případě jednorozměrného signálu lze prostorový strom reprezentovat jako jediný vektor (tedy jednorozměrné pole koeficientů). Vektor začíná DC koeficientem (prvek s indexem 0) a následují koeficienty postupně od nejvyšší úrovně rozkladu po nejnižší. Vyjma DC koeficientu má každý prvek s indexem své dva přímé potomky na indexech . Koeficient s indexem 1 tvoří kořen stromu. Situaci znázorňuje obrázek níže.

U transformace obrazu (tedy dvourozměrného signálu) je situace obdobná. Koeficienty zde nereprezentuje vektor ale matice (dvourozměrné pole). DC koeficient je prvek s indexy . Vyjma něj má každý prvek s indexy své čtyři přímé potomky na souřadnicích , tedy , , a . Situaci znázorňuje obrázek níže. Tato struktura odráží vztahy mezi vlnkovými koeficienty, které vznikly pyramidovým rozkladem.

Obdobná situace nastane i u vícerozměrných signálů. Pro popis algoritmu SPIHT je ještě podstatné stanovit nad prostorovými stromy jednu operaci, resp. definovat několik množin.

První z nich je množina indexů (souřadnic) kořenů. Spadají sem koeficienty z nejvyšší úrovně rozkladu, případně též DC koeficient. Tato množina se značí (highest pyramid level). Pro dvourozměrnou variantu stromu bude tedy obsahovat indexy , , , případně .

Druhou je množina indexů přímých potomků uzlu. Značí se jako (offspring) a pro dvourozměrnou variantu stromu může být definována jako . Pořadí není podstatné, ale musí být vždy stejné.

Třetí je množina indexů všech následníků uzlu (tedy i těch nepřímých). Označuje se jako (descendant). Do této množiny tedy patří všichni přímí potomci, všichni přímí potomci přímých potomků a tak dál až k listům stromu.

Další množinou je množina indexů všech nepřímých následníku uzlu. Označuje se a spadají sem všichni následníci uzlu vyjma jeho přímých potomků. Množina je definována jako .

K efektivní implementaci práce se stromy koeficientů lze využít Mortonův rozklad. Nyní je třeba definovat operaci významnosti na množině koeficientů. Množina je významná tehdy, pokud je významný alespoň jeden její prvek. V ostatních případech je nevýznamná. Operace významnosti se značí , kde je množina indexů. Definici lze zapsat jako následující rovnici. Ke zjednodušení zápisu jednoprvkových množin lze psát jako .

Algoritmus SPIHT pracuje v jedné ze svých částí s dělením množin a používá přitom množiny právě definované. Dělení množin probíhá podle následujících dvou jednoduchých pravidel. Počáteční množina je tvořena množinami a pro všechna . První pravidlo říká, že pokud je množina všech následníků významná, je rozdělena na a čtyři samostatné prvky . Druhé pravidlo říká, že jestliže je významná množina , je tato rozdělena na čtyři množiny s .

Vlastní algoritmus

Vlastní algoritmus pracuje se třemi seznamy. První seznam se značí LIS (list of insignificant sets), tedy seznam nevýznamných množin. Druhý se značí LIP (list of insignificant pixels) a obsahuje seznam nevýznamných koeficientů. Třetím je seznam LSP (list of significant pixels) a obsahuje seznam významných koeficientů. Seznamy LIP a LSP reprezentují jednotlivé koeficienty. Seznam LIS reprezentuje buď množinu nebo . Prvky tohoto seznamu jsou tedy dvojího typu. K jejich rozlišení je ve zmíněné práci použito následující značení – typ A reprezentuje a typ B reprezentuje .

Algoritmus pracuje iterativně a vlastní jádro sestává ze tří částí. První je průchod množinou LIP, následuje průchod množinou LIS – tyto kroky se nazývají srovnávací průchod (sorting pass). Třetí částí je průchod množinou LSP – tento krok se nazývá upřesňovací průchod (refinement pass). Při srovnávacím průchodu jsou koeficienty v LIP testovány na významnost a případně přesunuty do LSP. Obdobně jsou na významnost testovány množiny v LIS a podle uvedených pravidel případně rozděleny. Nově vzniklé množiny jsou umístěny zpět do LIS. Dělením vzniklé samostatné koeficienty jsou podle významnosti umístěny buďto do LIP nebo LSP. Jako následující algoritmus je uvedena původní varianta[1].

(Inicializace)
n := ⌊log2(MAX)⌋;
LSP := ϕ;
LIP := ;
LIS := pouze ty prvky z , které mají přímé potomky, jako prvky typu A;
(Srovnávací průchod)
for each  ∈ LIP do
    odešli ;
    if  = 1 then přesuň  do LSP a odešli znaménko ; end if
end for
for each  ∈ LIS do
    (Zpracování prvku typu A)
    if prvek je typu A then
        odešli ;
        if  = 1 then
            for each  do
                odešli ;
                if  = 1 then přidej  do LSP a odešli znaménko ; end if
                if  = 0 then přidej  na konec LIP; end if
            end for
            if  ≠ ϕ then
                přesuň  na konec LIS jako prvek typu B;
                go to (Zpracování prvku typu B);
            else
                odeber z LIS prvek ;
            end if
        end if
    end if
    (Zpracování prvku typu B)
    if prvek je typu B then
        odešli ;
        if  = 1 then
            přidej každý  na konec LIS jako prvek typu A;
            odeber  z LIS;
        end if
    end if
end for
(Upřesňovací průchod)
for each  ∈ LSP vyjma těch prvků přidaných v posledním srovnávacím průchodu do
    odešli n-tý nejvýznamnější bit ;
end for
(Další krok)
n := n-1;
go to (Srovnávací průchod);

Algoritmus pro dekódování vytvořeného bitového toku pracuje zcela shodně jako uvedený algoritmus pro kódování s tím rozdílem, že je slovo „odešli“ nahrazeno slovem „načti“. Seznamy LIS, LIP a LSP u kodéru a dekodéru musejí být tedy v každém okamžiku stejné. Dekodér postupně upřesňuje hodnoty vlnkových koeficientů. Když je koeficient přesunut do LSP, dekodér ví, že je jeho hodnota . Dekodér tedy použije tuto informaci spolu s příchozí informací o znaménku a nastaví rekonstruovaný koeficient . Podobně v průběhu upřesňovacího průchodu přičte nebo odečte dekodér od hodnotu . Nastavuje tedy odhadovanou hodnotu koeficientů do poloviny možného intervalu – je to klíčová výhoda algoritmu SPIHT.

Modifikace

Existuje množství modifikací tohoto algoritmu. Jednou z možných úprav je předsunutí upřesňovacího průchodu před srovnávací. Tím se sníží výpočetní náročnost, protože se odbourá potřeba sledovat nově přidané prvky seznamu LSP. Jestliže jsou dále prvky seznamů procházeny vždy v pevném pořadí od kořene k poslednímu listu, zmizí skok ze zpracování uzlu typu A do zpracování uzlu typu B (v podstatě příkaz goto). LIS, LSP a LIP již pak vlastně nejsou seznamy, nýbrž množiny (které se procházejí vždy ve stejném pořadí).

Související články

  • EZW – myšlenkový předchůdce algoritmu SPIHT
  • SPECK – podobný algoritmus od W. A. Pearlmana
  • EBCOT – algoritmus kódování DWT použitý ve standardu JPEG 2000

Reference

  1. Said, A.; Pearlman, W. A.: A New Fast and Efficient Image Codec Based on Set Partitioning in Hierarchical Trees. IEEE Transactions on Circuits and Systems for Video Technology, ročník 6, č. 3, Červen 1996: s. 243–250, doi:10.1109/76.499834. URL http://www.cipr.rpi.edu/research/SPIHT/EW_Code/csvt96_sp.pdf Archivováno 11. 12. 2009 na Wayback Machine

Externí odkazy

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.