# RemoveDirt

## Přehled

autor: Rainer Wittmann (aka kassandro)
verze: 0.9
stáhnout: http://www.removedirt.de.tf/
kategorie: Časové vyhlazovače
požadavky:

- YV12 & YUY2 Barevné prostředí
- šířka a výška klipu musí být dělitelná 8
- AvsRecursion
- msvcp71.dll/msvcr71.dll
licence: GNU General Public License

## Úvod

Od verze 0.8 byl tento plugin úplně přepsán. Už neobsahuje filtr RemoveDirt. Obsahuje už jen filtr RestoreMotionBlocks, který je jádrem AVS skriptové funkce RemoveDirt diskutované níže. Starý RemoveDirt trpěl dvěma problémy. Za prvé, rychlý pohyb velkých objektů způsoboval trhání po použití filtru RemoveDirt a za druhé v podstatě časový přístup RemoveDirt nebyl konkurenceschopný s prostorově-časovým přístupem RemoveDust (AVS skript funkce odvozená od mého balíku RemoveGrain ) pokud se jedná o výkon komprese. Pokud je má teorie o trhání pohybu po RemoveDirt správná, nová skriptová funkce RemoveDirt vyřeší tento problém. Základní myšlenkou nové skriptové funkce je použití starého RemoveDirt pro statické oblasti a ostřejší verze RemoveDust pro pohybové oblasti, kde RemoveDirt předtím neprováděl žádné čistění. Celkově se nový RemoveDirt snaží dosáhnout podobné, nebo lepší komprese než RemoveDust s podstatně více detaily v pohyblivých oblastech, kde RemoveDust často ničil pěkné detaily. Vzhledem k masivním změnám bude zatím starý soubor a starý zdrojový kód ještě dostupný. Pokud máte otázky nebo návrhy k RemoveDirt nebo ResoterMotionBlocks, neváhejte a napište raději na vlákno RemoveDirt z fóra doom9 než mi psát e-mail.

RemoveDirt podporuje barevná prostředí YV12 a planární YUY2. Takže pokud ho chcete použít na YUY2 klip, musíte ho převést z prolínaného (interleaved) YUY2 na planární YUY2 před RestoreMotionBlocks a pak zpět na prolínané YUY2 pomocí filtrů Interleaved2Planar a Planar2Interleaved z mého pluginu SSETools. Dosud neexistuje oficiální verze tohoto pluginu a tak jsou obsaženy v balíku RemoveGrain . Protože RemoveGrain upravuje podporu YUY2 také jen na planární formu, tento převod musí být proveden jen jednou před skriptovou funkcí, která je sestavená z filtrů těchto pluginů.

## Instalace

Balík RemoveDirt obsahuje dvě verze pluginu. RemoveDirt.dll (dynamicky připojovaný, proto malý), RemoveDirtSSE2.dll (jen pro SSE2 kompatibilní procesory, dynamicky připojovaný) a RemoveDirtS.dll (staticky připojovaný, proto velký). Zkuste nejdřív jeden ze dvou menších dll a zkopírujte ho do složky pluginů Avisynthu. Pokud nepracuje, je to pravděpodobně kvůli chybějící knihovně msvcr71.dll . Buď nainstalujte tuto knihovnu do C:\windows\system32 nebo smažte RemoveDirt.dll a nahraďte ho souborem RemoveDirtS.dll. Vložte do složky pluginů jen jeden dll soubor RemoveDirt. Pokud zaplníte složku pluginů všemi druhy nadbytečných souborů dll, tak jen zpomalíte start jakékoli aplikace, která používá Avisynth. Neměl by být žádný konflikt s jinými filtry.

## Použití

`RestoreMotionBlocks` (filtered, restore, neighbour, neighbour2, alternative, gmthreshold, mthreshold, pthreshold, cthreshold, noise, noisy, dist, tolerance, dmode, grey, show, debug)

Prvních pět proměnných jsou proměnné klipy. Všechny klipy musí být stejného typu (stejné šířky, výšky a barevného prostředí). Počet snímků je minimální délka ze všech těchto pěti klipů. První dvě proměnné jsou povinné. "filtered" je obvykle agresivně filtrovaný klip, ze kterého se mají odstranit pohybové artefakty. Pokud RestoreMotionBlocks identifikuje blok 8x8 jako pohyblivý, zkopíruje tento blok z klipu "restore" do klipu "filtered". To je základní operace funkce RestoreMotionBlocks. Pro identifikaci pohyblivých bloků používá RestoreMotionBlocks klip "neighbour". Výchozí hodnotou pro neighbour je klip "restore" . Nicméně, ve skriptu RemoveDirt se "neighbour" liší od "restore". "neighbour2" je pro použití RemoveDirt v kombinaci s filtry pro kompenzaci pohybu, jako MVtools (viz. MCRemoveDirt níže). Nakonec, pokud počet pohyblivých bloků překročí procento zadané v proměnné "gmthreshold" , pak RestoreMotionBlocks jednoduše bere snímek z klipu "alternative". V tomto způsobu mohou být specificky zpracovány změny scén nebo globální pohyb. Klip "restore" je výchozí hodnotou pro "alternative". Výchozí hodnotou pro gmthreshold je 80, t.j. pokud 80% bloků jsou pohyblivé bloky, pak je snímek brán z klipu "alternative". "mthreshold" je podobný jako ve starém RemoveDirt. Nicméně protože teď používáme obyčejný SAD pro porovnání bloků, hodnoty by měli být trochu vyšší, zvláště když je nízká hodnota šumu. Výchozí hodnotou pro "mthreshold" je 160. Pomocí proměnné "noise" je možné zadat úroveň šumu, která by měla být ignorována detekcí pohybu. Výchozí hodnotou "noise" je 0. Proměnná "noisy" je použita pro zadání počtu šumových pixelů na blok 8x8 , což musí být překročeno, aby to byl pohyblivý blok. Pokud noisy >= 0 a noise > 0, pak je hodnota "mthreshold" ignorována. Proměnné "pthreshold" a "cthreshold" jsou stejné jako ve starém RemoveDirt. Postprocessing (doplňkové zpracování) není v novém RemoveDirt změněn. Výchozí hodnata pro pthreshold je 10 a cthreshold ve výchozím nastavení odvozuje hodnotu od pthreshold. Záporné hodnoty jsou povoleny pro pthreshold a cthreshold, ale nejsou moc rozumné. Proměnné "dist" a "tolerance" jsou stejné jako v starém pluginu RemoveDirt pokud je dmode=0, výchozí. Výchozí hodnotou dist je 1 a výchozí hodnotou pro tolerance je 12. Pokud grey=true (false je výchozí), pak je barevnost v RestoreMotionBlocks ignorována. Logické proměnné "show" a "debug" jsou použity pro ladění (viz. kapitolu Ladění).

## Jak pracuje RestoreMotionBlocks

Aby proměnné výše pracovali správně, musí uživatel pochopit jak RestoreMotionBlocks pracuje. Sestává ze tří fází. Pro první fázi je použit jen klip "neighbour". Každý snímek je rozdělen na mřížku o blocích s rozměry 8x8 . Pokud je n číslo aktuálního snímku, tak pro každý blok této mřížky se RestoreMotionBlocks dívá na jas (luma) tohoto bloku v sousedu (n-1) a sousedu (n+1). Všimněte si, že nepoužíváme snímek (n). Jsou tři porovnávací metody (starý RemoveDirt má jen jednu). Pokud je noise= 0, tak je prostě vypočteno SAD každého bloku v sousedu (n-1) a sousedu (n+1). Pokud je to >= mthreshold, blok je identifikován jako pohyblivý blok snímku n. To je nejrychlejší metoda a podobná metoda byla použita ve starém RemoveDirt. Její klíčovou nevýhodou je, že se dá snadno zmýlit šumem. Pokud je noise >=0, tak místo SUM(|y-x|) RestoerMotionBlocks vypočítá SUM(| |y-x|-noise |). V podstatě, rozdíly s absolutní hodnotou <= noise jsou ignorovány. Pokud je to >= mthreshold, tak je tento blok identifikován jako pohyblivý blok. Nazýváme to šumově upravené SAD. Ze způsobu jak je šumově upravené SAD vypočítáno, je jasné, že "mthreshold" by měla být snížena pokud je "noise" zvýšeno. Pokud noise >= 0 a noisy >= 0, pak RestoreMotionblocks spočítá počet pixelů bloku, pro který absolutní rozdíl mezi sousedem(n-1) a sousedem(n+1) je >= noise. Pokud je toto číslo >= hodnotě "noisy", tak je blok identifikován jako pohyblivý blok. Nazýváme to NPC (= noisy pixel counting - počítání šmových pixelů) metoda. Hodnota mthreshold je ignorována pokud je zvolena metoda NPC. Všimněte si, že blok má 64 pixelů. Tedy pokud je noisy > 64, tak tam nemohou být žádné pohyblivé bloky. Z mého pohledu je NPC jasně nejlepší metoda. Má asi poloviční rychlost oproti SAD a asi stejnou rychlost jako NSAD. Noise=-1 a noisy=-1 jsou výchozí hodnoty. Takže SAD je výchozí metodou pro první fázi. Provedl jsem většinu svých testů RemoveDirt s noise=8 nebo 10 a noisy= 12. Jak se ukázalo pohyblivé bloky nalezené v první fázi se nazývají pohyblivé bloky 1 fáze. Ve druhé fázi, jsou spočítány všechny pohyblivé bloky nalezené v první fázi, které mají vzdálenost <= dist. Pokud je výsledek >= (tolerance /100) * (počet všech bloků z první fáze se vzdáleností <= dist), tak se tento blok nazývá motion neighbour (pohyblivý sousední) blok. Například pokud je dist = 1 a tolerance= 12 (výchozí hodnoty), tak je 9 bloků se vzdáleností <= 1. Protože 1 < (12/100)*9 < 2, musí být aspoň 2 pohybové bloky fáze 1 mezi 9 sousedními bloky tak, že je blok označený jako pohyblivý sousední blok. Pokud dmode= 0, pak všechny pohyblivé sousední bloky se stávají fází 2 pohyblivých bloků. Takže při dmode=0 se počet pohyblivých bloků docela zvyšuje. Při dmode= 2 pak nastává opak: pohyblivý blok fáze 1 se stává pohyblivým blokem fáze 2 jen, když je také pohyblivým sousedním blokem. V podstatě, je méně pohyblivých bloků fáze 2 než pohyblivých bloků fáze 1. Například pokud je dist=1, tolerance= 2, dmode= 2, pak jeden pohyblivý blok fáze 1 je zahozen, jestliže neexistují vzdálenější pohyblivé bloky fáze 1 se vzdáleností menší než 1. Dmode=1 je právě uprostřed mezi dmode=0 a dmode= 2: pohyblivé sousední bloky se stávají pohybovými bloky fáze 2. Tedy, pokud dmode=1, tak jsou pro detekci pohyblivých sousedních bloků významné jen pohyblivé bloky fáze 1. Po dokončení této úlohy je informace o fázi 1 zahozena. Pokud je dist=0 nebo dmode=2, gmthreshold by měla být snížena na 60 nebo dokonce 50. Třetí fáze, zvaná postprocessingová fáze začíná restaurováním pohyblivých bloků fáze 2, jejich kopírováním z klipu "restore" do klipu "filtered". Všechny pohyblivé bloky fáze 2 se stávají také pohyblivými bloky fáze 3. Pak jsou prověřovány hranice mezi pohyblivými a nepohyblivými bloky. Za tímto účelem je dvakrát vypočítáno SAD dvou sousedních okrajových čárových segmentů (tyto čárové segmenty jsou buď horizontální nebo vertikální a jsou 8 pixelů dlouhé). To je vypočteno nejdříve v klipu "restore" a pak v klipu "filtered". V klipu "filtered" jsou dva bloky ze dvou různých zdrojů, jeden blok, pohyblivý blok byl obnoven z klipu "restore" a nepohyblivý blok je z původního klipu "filtered". Protože snímky klipu "restore" nejsou vůbec změněny, oba bloky jsou ze stejného zdroje, měli by tedy do sebe zapadnout. Pokud je SAD hranic v klipu "filtered" > (SAD hranic v klipu restore) + pthreshold, pak je blok označen jako nový (doplňkový) pohyblivý blok fáze 3 a blok je obnoven zkopírováním z "restore" do "filtered", protože tyto dva bloky ve "filtered" k sobě dostatečně nezapadají ve srovnání se dvěma bloky v "restore". Jinými slovy, v této fázi je kontrolováno zda obnovený blok zapadá mezi zatím neobnovené bloky. Pokud tomu tak není, tak zatím neobnovené bloky, které dobře nazapadají, jsou označeny jako pohyblivé bloky fáze 3 a jsou také restaurovány. Tato procedura se opakuje dokud nejsou bloky, které by mohly být testovány. Pokud je hodnota proměnné grey rovna false, pak se to samé provádí pro jas i barevnost (chroma) (pro braevnost se použije proměnná cthreshold místo pthreshold). Pokud je grey= true, tak je proveden postprocessing jen pro jas.

Nakonec, jestliže procento všech pohyblivých bloků fáze 3 s ohledem na všechny bloky překročí hodnotu gmthreshold, pak je snímek z "filtered" zahozen a nahrazen odpovídajícím snímkem v "alternative". Tímto způsobem můžeme věnovat zvláštní zacházení ostrým změnám scén a scénám s pohybující se nebo přibližující se kamerou.

## Černobílé klipy

Pokud je grey=true pak barevnost klipu "filtered" není dotčená funkcí RestoreMotionBlocks. Také postprocessing je použit jen na jasovou komponentu. To je mírně rychlejší než grey=false. Pokud použijete grey=false na černobílé klipy, pak to nejen trvá déle, ale může to snížit kvalitu, protože šum barevnosti může spustit chybný postprocessing. Proto se velmi doporučuje použít "grey=true" pro černobílé klipy.

## Ladění

Logické proměnné debug a show se používají pro ladní. Pokud je show=true, pak bloky, které jsou označeny jako pohyblivé bloky v první fázi, jsou vybarveny červeně, ty které jsou nalezeny ve druhé fázi jsou vybarveny zeleně a nakonec pohyblivé bloky označené postprocessingem jsou vybarveny bíle. Takto se dá snadno zkontrolovat zda byly proměnné vhodně nastaveny. Při debug=true pak RestoreMotionBlocks posílá výstup následujícího typu do debugview utility:

    [348] [21495] RemoveDirt: motion blocks =  942(14%), 1652(25%),  635( 9%), loops = 31
    [348] [21496] RemoveDirt: motion blocks = 1745(26%), 2330(35%),   64( 0%), loops = 3
    [348] [21497] RemoveDirt: motion blocks = 1480(22%), 1973(30%),   45( 0%), loops = 4
    [348] [21498] RemoveDirt: motion blocks = 1081(16%), 1915(29%),   65( 1%), loops = 2
    [348] [21499] RemoveDirt: motion blocks = 1403(21%), 2380(36%),  235( 3%), loops = 10
    [348] [21500] RemoveDirt: motion blocks = 2618(40%), 2204(34%),   59( 0%), loops = 5
    [348] [21501] RemoveDirt: motion blocks =  986(15%), 2065(31%),   75( 1%), loops = 3
    [348] [21502] RemoveDirt: motion blocks = 1214(18%), 2291(35%),   78( 1%), loops = 3
    [348] [21503] RemoveDirt: motion blocks = 1348(20%), 2179(33%),   57( 0%), loops = 4
    [348] [21504] RemoveDirt: motion blocks =  961(14%), 1957(30%),   71( 1%), loops = 3
    [348] [21505] RemoveDirt: motion blocks = 1833(28%), 2201(33%),   38( 0%), loops = 3
    [348] [21506] RemoveDirt: motion blocks = 1644(25%), 2183(33%),   53( 0%), loops = 5
    [348] [21507] RemoveDirt: motion blocks = 1420(21%), 2541(39%),  132( 2%), loops = 5
    [348] [21508] RemoveDirt: motion blocks = 2238(34%), 2229(34%),  104( 1%), loops = 4
    [348] [21509] RemoveDirt: motion blocks = 1351(20%), 2294(35%),  181( 2%), loops = 6
    [348] [21510] RemoveDirt: motion blocks =  931(14%), 1800(27%),  229( 3%), loops = 5

První číslo v hranatých závorkách na levé straně je id procesu, který spouští skript, druhé číslo v hranatých závorkách je číslo snímku. První číslo (s procenty v závorce) za "motion blocks =" je počet pohyblivých bloků fáze 1, druhé je rozdíl mezi pohyblivými bloky fáze 2 a fáze 1 (vždy >=0 pokud je dmode=0, vždy <= 0 pokud je dmode= 2) a třetí je rozdíl mezi pohyblivými bloky fáze 3 a fáze 2 (vždy >= 0). Nakonec, číslo za "loops =" je počet opakování postprocessingu použitých pro tento snímek. Debug=true může být použito pro monitorování RestoreMotionBlocks při enkódovacím procesu. Samozřejmě show=true může být použito jen před enkódovacím procesem k nalezení správných hodnot pro různé proměnné.

## SCSelect

SCSelect je speciální filtr, který rozlišuje začátky scén, konce scén a globální pohyb. Výstup z SCClense je použit jako klip "alternative" pro RestoreMotionBlocks. Těžko může být použit pro jiné účely, protože jen vytváří správná rozhodnutí, jestli je tam hodně pohyblivých bloků. Jen když je procento pohyblivých bloků > gmthreshold, tak RestoreMotionBlocks volí snímek z klipu zadaného proměnnou alternative a pak tam je vždy hodně pohyblivých bloků, pokud gmthreshold není příliš malý (gmthreshold >= 30 by mělo být dostatečně velké). SCSelect vysílá nesmyslné výsledky, když je tam jen trocha pohybových bloků. SCSelect je použito následovně:

`SCSelect` (clip input, clip scene_begin, clip scene_end, clip global_motion, float dfactor, bool debug, bool planar)

První čtyří klipové proměnné jsou povinné a nemají žádná jména. Všechny čtyři klipy musí mít stejné barevné prostředí, šířku a výšku. První je klip, na kterém SCSelect založí své rozhodování. Obvykle by to měl být stejný klip, který byl zadán proměnnou "neighbour" v RestoreMotionBlocks. Pokud si SCSelect všimne začátku scény, vybere její výstupní snímek z klipu scene_begin. Pokud si SCSelect všimne konce scény, vybere její výstupní snímek z klipu scene_end. Pokd si SCSelect všimne globálního pohybu, vybere jeho výstupní snímek z klipu global_motion. Tedy SCSelect nevytváří žádné nové snímky. Provádí pouze výběr z různých zdrojů. Dfactor je klíčová proměnná pro citlivost na změnu scény. Čím vyšší dfactor, tím méně snímků bude detekováno se začátky a konci scén a tím více snímků s globálním pohybem. Dfactor=4.0 je výchozí hodnota. SCSelect pracuje s YV12 a planárním YUY2. Pokud je použito planární YUY2 , pak musí být zadáno planar=true. Při debug=true SCSelect posílá výstup následujícího typu do debugview utility:

    [3416] [67865] SCSelect: global motion
    [3416] [67866] SCSelect: global motion
    [3416] [67870] SCSelect: global motion
    [3416] [67871] SCSelect: global motion
    [3416] [67873] SCSelect: global motion
    [3416] [67874] SCSelect: global motion
    [3416] [67877] SCSelect: global motion
    [3416] [68318] SCSelect: global motion
    [3416] [68319] SCSelect: global motion
    [3416] [68557] SCSelect: scene end
    [3416] [68558] SCSelect: scene begin
    [3416] [69481] SCSelect: scene end
    [3416] [69482] SCSelect: scene begin
    [3416] [70240] SCSelect: scene end
    [3416] [70241] SCSelect: scene begin
    [3416] [70406] SCSelect: global motion
    [3416] [70407] SCSelect: global motion
    [3416] [70408] SCSelect: global motion
    [3416] [70409] SCSelect: global motion
    [3416] [70410] SCSelect: global motion
    [3416] [72032] SCSelect: global motion
    [3416] [72164] SCSelect: global motion
    [3416] [72165] SCSelect: global motion

Pro popis základní myšlenky za SCSelect řekněme, že SAD(n) je rozdíl SAD mezi snímky input(n) a input(n+1). Nyní, pokud SAD(n) > dfactor * SAD(n-1), tak SCSelect rozpozná konec scény a vytáhne snímek z klipu scene_end. Pokud je SAD(n-1) > dfactor * SAD(n), tak SCSelect rozpozná začátek scény a vytáhne snímek z klipu scene_begin. Pokud jak SAD(n) <= dfactor * SAD(n-1) tak i SAD(n-1) <= dfactor * SAD(n), tak SCSelect rozpozná globální pohyb a vytáhne snímek z klipu global_motion. Z tohoto popisu je jasné, že dfactor musí být > 1 pro získání rozumných výsledků. Algoritmus výše je optimalizován tak, že často je počítáno jen jedno SAD a ne dvě pro jeden požadovaný snímek. Nicméně, existují určité nedostatky. Pokud scéna končí s globálním pohybem, pak SCSelect často neumí detekovat konec scény. Pokud scéna začíná s globální pohybem, pak SCSelect často neumí detekovat začátek scény. Tyto dva efekty jsou obvykle odpovědné za to, že jsou v SCSelect detekovány jako začátky a konce scén osamělé snímky, jinak každému začátku scény měl předcházet konec scény. Zjemněním algoritmu výše bychom se mohli vyhnout samostatným začátkům scén a koncům scén, ale existuje jedna situace, kde dokonce i také zjemnění selhává. Jmenovitě když jsou konce scén s globálním pohybem a nová scéna začíná s globálním pohybem. Pak může být ostrá změna scény spolehlivě detekována jen s dobrou analýzou pohybu, což by vedlo k extrémnímu zpomalení filtru.

## RemoveDirt

RemoveDirt se nyní stal AVS skriptovou funkcí, která zahrnuje RestoreMotionBlocks a různé filtry z mého balíku RemoveGrain (je nutná verze 0.9 nebo vyšší). Během testů jsem používal následující skript:

    function RemoveDirt(clip input, bool "_grey", int "repmode")
    {
        _grey=default(_grey, false)
    	repmode=default(repmode, 16)
    	clmode=17
    	clensed=Clense(input, grey=_grey, cache=4)
    	sbegin = ForwardClense(input, grey=_grey, cache=-1)
    	send = BackwardClense(input, grey=_grey, cache=-1)
    	alt=Repair(SCSelect(input, sbegin, send, clensed, debug=true), input, mode=repmode, modeU = _grey ? -1 : repmode )
    	restore=Repair(clensed, input, mode=repmode, modeU = _grey ? -1 : repmode)
    	corrected=RestoreMotionBlocks(clensed, restore, neighbour=input, alternative=alt, gmthreshold=70, dist=1, dmode=2, debug=false, noise=10, noisy=12, grey=_grey)
    	return RemoveGrain(corrected, mode=clmode, modeU = _grey ? -1 : clmode )
    }

Proberme si tento skript podrobněji. Nejdříve použijeme brutální časový (temporal) vyhlazovač z balíku RemoveGrain pro získání klipu "clensed". Pak použijeme filtry ForwardClense a BackwardClense z RemoveGrain pro vytvoření klipu "alt", který je pak použit jako proměnná "alternative" v následném RestoreMotionBlocks. Zatímco Clense provádí hodně čistění, určitě vytváří hodně artefaktů v oblastech pohybu. Ve skriptové funkci RemoveDust, je klip "clensed" zcela opraven filtrem Repair z balíku RemoveGrain. V RemoveDirt je tato oprava provedena jen v oblastech pohybu. Statické oblasti nejsou opravované. Protože klip je použit jen pro obnovení pohyblivých oblastí, můžeme použít mnohem silnější režim opravy Repair mode 16 (v RemoveDust jsou obvykle použity režimy 2 nebo 5), což obnoví tenké čáry zničené v clense. Nakonec, protože tam může zůstat něco z časového odšumění, zvláště, když je zrnění (grain) husté, použijeme prostorový odšumovač RemoveGrain(mode=17) pro odstranění těchto nečistot nebo zbytků šumu.

## Optimalální použití

1. Pokud je to možné, ořezávejte po RestoreMotionBlocks. Moderní kodeky dělí snímky stejným způsobem jako RemoveDirt do mřížky s bloky 8x8 pixelů pro vykonání rozhodující diskétní kosinové transformace pro takové bloky. Nyní, jestli je klip oříznut po RemoveDirt, tak mřížka RemoveDirt a kodeku se asi liší což vede k nižší kompresi. Existuje ale jedna výjimka: pozdější oříznutí neškodí, když všechny čtyři strany jsou oříznuty násobkem 8. Například, crop(8,64,0,-72) je ok. Na druhé straně, by se mělo ořezávat po RemoveGrain/Repair pokud je to možné, protože tyto filtry nemohou zpracovat hraniční pixely. Tedy optimálním řešením je ořezávat později a to jen o násobky čísla 8, což bohužel není vždy možné.

2. Ořezávejte jen s "align=true". RestoreMotionBlocks silně využívá SSE/SSE2 instrukce. Pokud ořezáváte bez "align= true" před RestoreMotionBlocks, tak data ve snímcích nemusí být správně zarovnána a RemoveDirt bude pracovat podstatně pomaleji. To je obzvlášť důležité pro SSE2 verzi. V důsledku můžete vždy ořezávat v Avisynthu a ne v DVD2AVI nebo DGIndexu.

3. Videa zpracovaná pomocí telecine musí být zpracována pomocí inverzního telecine před RemoveDirt. Pokud je film zpracovaný pomocí telecine, jsou některá pole duplikována aby se zvýšila frekvence snímků z 24fps na 30fps. Proto v takových duplikovaných polích základní vlastnost nečistoty, popsaná výše už neplatí a žádný časový vyhlazovač si nemůže všimnout nečistot v takových duplikovaných polích. Na druhou stranu, po inverzním telecine je obvykle každý čtvrtý snímek složený z polí, která pochází ze dvou různých snímků. Vizuálně tyto dvě pole zapadají do sebe dobře, ale obě jsou z různého kompresního kontextu, což může zmýlit RemoveDirt ke špatné detekci pohybu. V extrémních případech, může být jedno pole z I- nebo P-snímku, zatímco další je z B-snímku. Ale dokonce jsou pole ze snímků stejných typů, různý kompresní kontext má významný efekt. Proto RemoveDirt nepracuje tak dobře na videích zpracovaných inverzním telecine, jako v nativních progresivních videích. Ze stejného důvodu je také komprese videí zpracovaných inverzním telecine horší než u nativních progresivních videí. My evropané bychom měli každý den děkovat bohu za to, že nemáme telecine materiály. Nicméně, zde v Německu máme digitální TV vysílání, které rádi třepí progresivní filmy (kolem 5% všech progresivních filmů z ARD a zvláště ZDF je roztřepených). Naštěstí tito idioti nejsou schopni duplikovat pole, takže RemoveDirt by měl pracovat, ale v roztřepených filmech je nečistota vždy rozdělena do dvou snímků, které zřejmě bolí RemoveDirt. Na druhou stranu, pokud jsou tyto roztřepené filmy zbaveny roztřepení, tak máme problém kompresního kontextu pro každý snímek a ne jen pro každý čtvrtý snímek. Krokováním ve videu s vestavěným filtrem Bob() lze rozhodnout s téměř absolutní jistotou, zda je video opravdu progresivní, prokládané, zpracované pomocí telecine, se smíchanými poli nebo progresivní s posunutými poli.

4. Vložte další filty za RemoveDirt. Kromě těch filtrů zmíněných dříve, jako crop a inverse telecine, by měli být všechny ostatní filtry vloženy za RemoveDirt v Avisynth skriptu, protože většina filtrů má spíše negativní než pozitivní dopad na detekci nečistot.

`$English Date: 2005/05/07 $`

`Český překlad:29.4.2009`