# VagueDenoiser

## Přehled

autor: Lefungus, Kurosu, Fizick
verze: 0.35.1
stáhnout: http://avisynth.org.ru, http://avisynth.org/warpenterprises/
kategorie: Prostorové vyhlazovače
požadavky:

- YV12 & YUY2 & RGB barevné prostředí

licence: GPL

## Úvod

Toto vlnový (Wavelet) odšumovač.
V zásadě převádí každý snímek ze vstupního videa do vlnové oblasti, použitím různých vlnových (wavelet) filtrů. Pak aplikuje nějaké filtrování k získaným koeficientům. Potom provede inverzi vlnového převodu. Kvůli vlnovým vlastnostem, by měl dávat pěkný hladký výsledek, a snížit šum, bez rozmazání rysů obrazu. Tento vlnový převod může být udělán na každé ploše barevného prostředí. Tento filtr používá vlny (wavelets) z Brislawnova tutorialu.

## Syntaxe filtru VagueDenoiser

`VagueDenoiser` (clip, int "threshold", int "method", int "nsteps", float "chromaT", bool "debug", bool "interlaced", int "wavelet", bool "Wiener", float "wratio", integer "percent", clip "auxclip")

#### Parametry:

threshold: desetinný (float) (výchozí=0)
Síla filtrování. Čím vyšší, tím více bude klip filtrovaný. Při tvrdém nastavení se může použít vyšší prahová hodnota než při měkkém nastavení dokud klip nevypadá přefiltrovaný.
Při nastavení < 0 bude vypnuto odstraňování šumu na jasové složce
Pokud je nastaveno = 0, tak je prahová hodnota odhadnuta automaticky (adaptivně)

method: -1 až 4 (výchozí=3)
Filtrační metoda, kterou filtr použije.
-1 : Bez stanovení prahových hodnot (ladící účely)
0 : Tvrdé stanovení prahových hodnot. Všechny hodnoty pod prahovou hodnotou budou vynulovány.
1 : Měkké stanovení prahových hodnot. Všechny hodnoty pod prahovou hodnotou budou vynulovány. Všechny hodnoty nad, budou sníženy o prahovou hodnotu.
2 : Adaptivní stanovení prahových hodnot (metoda NormalSrink). Násobí vstupní prahovou hodnotu podle lokálních vlnových dat (lokální = úrovně podpásma vlnové úrovně).
3 : Qianovo (garrotovo) stanovení prahových hodnot. Násobí nebo nuluje koeficienty - střední mezi (více) měkkým a (méně) tvrdým stanovením prahových hodnot.
4 : Jednotně hladká smršťující funkce.

nsteps: celočíselný (výchozí=4)
Počet kroků v kolika vlny rozloží obraz. Vysoké hodnoty mohou být pomalejší, ale výsledky budou lepší.
Navrhované hodnoty jsou 3-6.
Obraz nelze rozkládat za určitou mez (typicky 8 pro snímek 640x480 - protože 2^9 = 512 > 480)

chromaT: desetinný (float) (výchozí=-1)
Nastavuje prahovou hodnotu filtrování barevnosti (chroma). Je to pomalejší, ale dává lepší výsledky.
Pokud je nastaven < 0, tak bude odšumění barevnosti vypnuto (výchozí režim)
Pokud je nastaveno = 0, tak je prahová hodnota odhadnuta automaticky (adaptivně)

debug: true nebo false
Deaktivuje inverzní převod pro přímé zobrazení (ale nenormalizuje nyní koeficienty).
Také zapíná výstup pro utilitu Debugview

interlaced: true nebo false (výchozí=false)
Snaží se zpracovat pole klipu jednotlivě.

wavelet: celočíselný 1, 2 a nebo 3 (výchozí=1)
Vybírá typ vln (wavelet):
1 - Cohen-Daubechies-Feauveau 9/7 - populární, pravděpodobně nejlepší
2 - Brislawn 10/10 (ostrý, používal se jako jediný ve všech předchozích verzích od 0.23 do 0.29)
3 - Villasenor-Belzer-Liao 6/10

Wiener: true nebo false (výchozí=false)
Aktivuje WienerChop dvouprůchodový režim odšumění pro silné odšumění s vysokou prahovou hodnotou (pomalý).
V prvním průchodu se dělá odhad šumu převodem s první vlnou (jiná než vybraná vlna) s vybranými nataveními,
druhý průchod je optimální Wienerovo odšumění druhou (vybranou) vlnou.
Druhá vlna 1 je použita s první (odhadovací) vlnou 3,
Druhá vlna 2 je použita s první (odhadovací) vlnou 1,
Druhá vlna 3 je použita s první (odhadovací) vlnou 1.

wratio: desetinný (float) (výchozí=0.5)
Hodnota standardní odchylky šumu pro Wienerovo odšumění jako relativní poměr k hodnotě prahové hodnoty.

percent: celočíselný od 0 do 100 (výchozí=85)
Částečné nebo plné odšumění (omezené zmenšení koeficientů).

auxclip: pomocný klip pro první průchod Wienerova režimu (výchozí=není, zdroj)
Předfiltrovaný zdrojový klip, nejlépe s časovým nebo prostorově-časovým filtrem (jako DeGrainMedian) pro nejlepší odšumění a potlačení artefaktů.

## Příklady použití filtru VagueDenoiser

(všechny řádky avisynth skriptů zde jsou jen příklady)

### Některá oblíbená (kdysi) nastavení Lefunguse

Pro mírné filtrování obyčejného videa. (střední->threshold=1-1.5; silné->threshold=2-3)

    VagueDenoiser(threshold=0.8, method=1, nsteps=6, chromaT=0.8)

Pro mírné filtrování animovaného videa. (střední->threshold=2; silné->threshold=4)

    VagueDenoiser(threshold=1.5, method=1, nsteps=6, chromaT=2.0)

Quianovo stanovení prahových hodnot je upřednostněnou metodou, protože je podobnější optimálnímu (Bayesian).

### Některá silná (ale pomalá) nastavení od Fizick

Pro silné filtrování (s vysokou prahovou hodnotou) zašumělého prokládaného analogového videa. V tomto případě je charakteristické objevování artefaktů "kapek" , obzvláště pro tvrdé stanovení prahových hodnot (Quianův režim je optimální). To je důsledek použití rychlého decimovaného vlnového převodu, a také pulsování "horkých" pixelů. Použijte optimální Wienerův filtr. Nejdříve proveďte odhad výkonu signálu a šumu v jednom vlnovém základu. Pak použijte jiný vlnový základ (téměř nekorelovaný) pro filtrování, t.j. slabé snížení hodnoty (použitím předchozího odhadu). Dodatečně snižte vliv "horkých pixelů" mediánovým časovým předfiltrováním (undot, degrainmedian), a použijte výsledek jako pomocný klip pro odhad šumu. Tento pomocný klip lze silně filtrovat protože ho nepoužíváte jako vstup pro Vaguedenoiser. (Ostatně, teď nezískáte přísně prostorové vyhlazení). Viz příklad (pomalý):

    LoadPlugin("vaguedenoiser.dll")
    LoadPlugin("degrainmedian.dll")
    avisource("input.avi")
    aux=DeGrainMedian(mode=0, limity=7, interlaced=true)
    VagueDenoiser(threshold=7, auxclip=aux, interlaced=true, wiener=true)

## Historie a stažení

- v 0.12 First Release
  - Precision problems corrected, 0 for threshold is now lossless.
- v 0.13
  - Hard thresholding method enabled.
  - Cosmetic changes.
  - Avisynth parameters changed.
- v 0.2
  - Implemented many new wavelet filters, thanks to the wavelet transform coder construction kit. look at http://www.geoffdavis.net/ for more informations.
  - Implemented nsteps parameter, that allow you to use n steps in the selected wavelet tranform.
  - Some nsteps values could produce unvalid results, reducing this value generally solve the problem.
  - Little optimizations from Shodan and Bidoche.
- v 0.22
  - YUY2 colorspace support.
  - Optionnal chroma filtering, (chroma=true/false).
  - Cosmetic changes, code cleaned.
  - Html documentation.
- v 0.23
  - Code cleaned, filters class removed.
  - Better parameters for compilation. Should really works on every cpu now.
  - Removed all filters except Brislawn 10/10, so filter parameter has been removed.(it's like filter=7).
  - A little speed increase (3-5fps on a 640x256 frame with nsteps=6).
- v 0.24
  - Another speed increase, some critical loops unrolled (To infinity and beyond!)
- v 0.241
  - height and width must be mod4, added errors messages if not
  - Cleaned include thanks to Kurosu
- v 0.242
  - Removed restrictions on width/height, fixed bugs
  - Some improvements from Kurosu
- v 0.243
  - Code cleaned
- v 0.25
  - Little speed increase (due to some little profiles and vectorizations)
  - added defaults
  - added a visual.net compiled dll for compatibility purposes. This dll is slower
- v 0.26 (Kurosu)
  - Merged (C++ frenzy) all assembly parts from Kurosu's version into one dll
  - Hence, speed increase
  - Undone previous vectorization optimizations
  - All improvements are available for YV12 only
- v 0.26.1 (Kurosu)
  - Merge from Sh0dan on copy
  - Cleaner and safer management from Bidoche
  - Fixed a crash that may have affected P4 users (Athlons with SSE support weren't affected as 3DNow! code, being the fatest, is always selected).
  - Added debug output and NOOP threshold method (for debug purpose)
- v 0.27.0 (Kurosu)
  - Continued integration and added framework for Haar wavelet (still not functionnal, deactivated)
  - All optimizations proposed by Sh0dan, ARDA and Bidoche
  - Some registers reuse (AMD-64 gonna rock) for some more speed (5%)
  - Added Qian thresholding
- v 0.27.1 (Kurosu)
  - Fixed YUY2 mode
  - Added RGB24 and RGB32 mode
  - The 3 above modes are unlikely to get any speed optimization
- v 0.28.0 (Kurosu)
  - Fixed all modes to properly process what needs to be processed (small speedup)
  - Unrolled float2byte conversion, little speed-up
  - Added interlaced (see option with that name) support to YV12 colorspace
  - Workspace compatible with ICL7. dll isn't compiled in that mode for legal reasons (I don't own ICL)
  - Decteted a major slowdown for MOD64 width. Avoid them, as applying this filter before resizing might be faster in fact (particularly true for widths of 512)
- v 0.28.1 (Kurosu)
  - MOD64 width slowdown is due to something needing a dreadfull rewrite, so no fix
  - Implemented cleaner support of YUY2 and RGB24/32
  - Interlaced mode now works in all mode (processing in interlaced mode is a little bit faster but you loose precision)
- v 0.28.2 (Kurosu)
  - Ported to nasm the assembly parts
- v 0.29 (Kurosu)
  - More nasm
  - More bug fixes
- v 0.30 (Fizick)
  - Added (restored) CDF 9/7 wavelet (C version only) and wavelet selection option
  - Added WienerChop two-pass denoising mode using two different wavelet basises.
  - Replaced boolean "chroma" parameter to float "chromaT" as threshold value for chroma planes
  - Added automatic (adaptive) threshold estimation
  - 3DNow mode of hard thesholding temporary replaced by SSE or C versions.
  - Fixed possible memory leakage bug for non YV12 modes
- v 0.31 (Fizick)
  - Added noise ratio parameter for Wiener pass
  - Fixed interlaced mode. Seems it now work.
  - 3DNow mode of Qian thesholding temporary replaced by SSE or C versions.
- v 0.32 - July 09, 2004 (Released by Fizick, but part of work was done by Kurosu)
  - Added Villasenor-Belzer-Liao 6/10 wavelet (not optimized C version only)
  - Changed estimation wavelets to more optimal pairs for WienerChop mode.
  - 3DNow optimized version of WienerChop and AutoThreshold - thanks to Kurosu.
  - 3DNow mode of hard and Qian thesholding re-enabled after some bugs were fixed by Kurosu and Fizick.
  - Small speed increasing mainly due to copy reverse order
  - But big slowdown for mod64 width (especially 512!) still exists.
  - SSE float-byte conversion has bug for some width, temporary replaced to C version.
  - Ported to NASM memcopy assembly function (no more non-NASM assembly).
- v 0.32.1 - July 10, 2004 (Fizick)
  - Fixed bug in copy function, introduced in v.0.32
  - Re-enabled SSE optimized float-byte and byte-float conversion after fixing some bugs
- v 0.33 - July 11, 2004 (Fizick)
  - Fixed slowdown for mod64 width by padding (thanks to MfA)
  - Add partial denoising mode (by blending with source)
  - Fixed bug with AutoThreshold for 3DNow.
  - AutoThreshold is now also dependent from "wratio" parameter.
  - Added messages for Debugview utility.
  - Change some parameters default values to more optimal (for me?): thresh=0 (auto), method=3, nsteps=4, wavelet=1, percent=75.
- v 0.33.1 - July 13, 2004 (Fizick)
  - Fixed bug with mod64 width for SSE (by pad increasing from 2 to 4)
- v 0.33.2 - July 17, 2004 (Fizick)
  - Fixed bug with default values.
- v 0.33.3 - July 21, 2004 (Fizick)
  - Fixed bug with YUY2 (introduced in v.0.32.1)
- V.0.33.4 - August 23, 2004 (Fizick)
  - Fixed bug with mirrored padded pixels (thanks to Eugen65 for report).
- V.0.33.5 - September 28, 2004 (Fizick)
  - Fixed bug with AutoThreshold for Interlaced Wiener mode (thanks to Viperzahn and LigH for report).
- V.0.33.6 - October 13, 2004 (Fizick)
  - Nsteps parameter now is auto-limited to max admissible value if input too big or =0 (don't worry, Viperzahn :-)
  - Some improving of exception handling (try-catch-throw).
- V.0.33.7 - October 17, 2004 (Fizick)
  - Decreased max admissible value of nsteps to fix some internal bug (or feature) (thanks to Viperzahn for insistent report :-)
- V.0.34 - November 24, 2004 (Fizick)
  - Added auxiliary (some prefiltered) clip for first pass of Wiener mode.
- V.0.34.1 - December 19, 2004 (Fizick)
  - Some fix for mem_set compatibility with old CPU (P2).
- V.0.34.2 - March 11, 2005 (Fizick)
  - Fixed small bug (blue dot) for chromaT>=0 in YV12 for Athlon (Thanks to Pavico for report).
  - Added pitch for internal buffers.
- V.0.34.2.0 - June 13, 2005 (Fizick)
  - Updated documentation.
- V.0.34.3 - September 11, 2005 (Fizick)
  - Fixed AutoThreshold algorithm.
- V.0.35 - September 17, 2005 (Fizick)
  - Improving soft method=1 - do not filter lowest level anymore, mean picture intensity is not changed now .
  - Re-enabled method=2 of multilevel subband adaptive thresholding, implemented as NormalShrink method;
  - Added method=4 uniformly smooth shrinking function;
  - Replaced partial denoising blend mode by limited shrinking of small coefficients for all thresholding functions;
  - Changed default percent=85;
  - Implemented new SSE versions for method=0,3,4 and C versions for rest (3DNow disabled with 4% speed decreasing);
  - Added 3DNow optimized versions for transform of wavelet 1 and 3 (10% speed).
- V.0.35.1 - September 26, 2005 (Fizick)
  - Added YUY2 and RGB format for auxclip

## Poděkování

* Všem na Doom9.org za jejich rady.
* MarcFD za jeho mpegdec3 html dokumentaci. Tento html soubor je stejný, ale s upraveným obsahem.
* Lefungusovi za jeho VagueDenoiser html dokumentaci. Tento html soubor je stejný, ale s upraveným obsahem. :)
* Kurosu za jeho VagueDenoiser html dokumentaci. Tento html soubor je stejný, ale s upraveným obsahem. :-) (ale nyní částečně přeformátovaný)
* Geoffu Davisovi, autorovi konstrukčního nástroje kodéru vlnového (wavelet) převodu.
* Lefungusovi, tvůrci VagueDenoiser.
* Kurosu, reorganizce a optimalizace kódu.
* Fizick, nějaká deorganizace a deoptimalizace kódu. :-)

## Distribuce kódu

Toto je svobodný software šířený za podmínek GNU-GPL v2 .

## Kontakt

Můžete napsat e-mail Lefungusovi: lefungus (at) altern (dot) org s většinou návrhů, hlášením chyb, požadavkům na funkce, a další.
Lefungusova webová stránka: http://perso.wanadoo.fr/reservoir/avisynth.html
Otázky optimalizace jsou pro Kurosu.
Ještě by jste měli vědět, že najdete Kurosu zde: kurosu (at) inforezo (dot) org
Fizick není za nic odpovědný, ale obvykle se snaží o dokonalost :)
Fizick je k přístupný na: bag (at) hotmail (dot) ru, a jeho webová stránka s pozdějšími verzemi musí být na: http://avisynth.org.ru nebo jeho zrcadle.

Pro podporu jděte na fórum http://forum.doom9.org/showthread.php?s=&threadid=56871.

`$English Date: 2005/10/05 18:12:43 $`

`Český překlad:22.3.2009`