Plugin je založen na Conditional Temporal Median Filter v.0.93 (C-plugin pro Avisynth 2.5)
od Kevina Atkinsona http://kevin.atkinson.dhs.org/temporal_median/
(Tento dokument je také založen na jeho dokumentaci.)
Polovina snímku z mého starého 8mm filmu (nahoře - před, dole - po filtraci):
Avisynth skript pro tento příklad, který ukazuje práci staré verze filtru 0.93, ale adaptovaný do nové verze 3.2.
AviSource("film8mm.avi") LoadPlugin("despot.dll") ConvertToYV12() Crop(0,0,720,288) #pro zobrazení testu i = last # Porovnáme poloviny snímků s a bez redukce šumu DeSpot(p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=0, motpn=false, seg=0) StackVertical(i, last)
Stejný snímek po použití některých parametrů z novější verze filtru 1.0 (horní polovina - s rozmazáním okrajů skvrn, spodní polovina - s časovým vyhlazením ve statických oblastech):
Avisynth skript pro tento příklad :
AviSource("film8mm.avi") LoadPlugin("despot.dll") ConvertToYV12() Crop(0,0,720,288) # Porovnáme snímky s rozmazáním, a s a bez časové redukce šumu i = last # Porovnáme poloviny snímků s a bez redukce šumu b = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=4, motpn=false, seg=0) t = DeSpot(i, p1=35, p2=14, pwidth=70, pheight=70, mthres=25, mwidth=20, mheight=15, interlaced=false, \ merode=33, ranked=false, p1percent=0, dilate=0, fitluma=false, blur=4, motpn=false, seg=0, tsmooth=3) StackVertical(b, t)
V nových verzích filtru jsou uvedeny některé doplňkové parametry, pro správnější detekci skvrn a odstraňování skvrn bez artefaktů.
DeSpot může být načten jako jakýkoli Avisynth plugin, buď vložením do složky Plugins nebo použitím LoadPlugin. Základní použití:
AviSource("d:\video.avi") # vstup MUSÍ být YV12 LoadPlugin("despot.dll") ConvertToYV12() DeSpot(p1=35, p2=14, mthres=25)
Filtr může pracovat ve 2 hlavních režimech, přepínaných parametrem median (od verze 2.0):
median (true nebo false, výchozí = false),
false - režim odstraňování skvrn - filtr se pokusí identifikovat šum a eliminovat ho.
true - prostý mediánový režim - filtr použije prostý časový mediánový filtr na
nehybné oblasti obrazu.
Syntaxe výzvy funkce:
DeSpot
(clip, int "mthres", int "mwidth", int "mheight",
int "merode", bool "interlaced", bool "median", int "p1", int "p2", int "pwidth",
int "pheight", bool "ranked", int "sign", int "maxpts", int "p1percent",
int "dilate", bool "fitluma", int "blur", int "tsmooth", int "show", int "mark_v",
bool "show_chroma", bool "motpn", int "seg", bool "color", int "mscene", int "minpts",
clip "extmask", bool "planar")
p1 (výchozí 24)
p2 (výchozí 12)
Pixel se musí lišit od svých sousedů o nejméně 'P1' v jasové složce, aby byl považován za šum. Okolní pixely se musí
lišit o nejměně 'P2' , aby byly považovány za součást stejné skvrny.
pwidth (výchozí 6)
pheight (výchozí 5)
Skvrna nemůže být širší než pwidth a vyšší než pheight
ranked (true nebo false, výchozí=true)
Zapíná režim žebříčkového řazení rozdílu detektoru skvrn se 6 body místo 2.
sign (výchozí 0)
Nastavuje režim pro odstraňování jen černých nebo bílých skvrn nebo obojího:
sign = 0 - jakékoli skvrny a jejich okolí (výchozí)
sign = 1 - jen černé (tmavé) skvrny a jejich tmavé okolí
sign = -1 - jen bílé (světlé) skvrny a jejich světlé okolí
sign = 2 - jen černé (tmavé) skvrny a jejich jakékoli okolí
sign = -2 - jen bílé (světlé) skvrny a jejich jakékoli okolí
maxpts (od 0 do 10000000, výchozí=0 - bez omezení)
Nastavuje horní limit bodů (pixelů) na každou skvrnu.
minpts (od 0 do 10000000, výchozí=0 - bez omezení)
Nastavuje spodní limit bodů (pixelů) na každou skvrnu.
p1percent (od 0 do 100, výchozí=10)
Nastavuje spodní limit relativní části vysoce kontrastních (podle kriteria P1) pixelů na skvrnu (v procentech).
dilate (od 0 do 255, výchozí=1)
Nastavuje rozsah morfologického rozšíření (růstu) odstraněné skvrny (v pixelových jednotkách).
fitluma (true nebo false, výchozí=true)
Zapíná určitou korekci jasu v místech vymazaných skvrn.
blur (od 0 do 4, výchozí 1)
Hodnota (délka) lokálního prostorového rozmazání poblíž okrajů smazané skvrny.
tsmooth (od 0 do 127, výchozí 0)
Ovládá časové vyhlazení ve statických oblastech (mimo skvrn a pohybu).
Nastavuje přibližnou prahovou hodnotu variace jasu pixelu ve 3 snímcích,
Čím více variace překročí tuto prahovou hodnotu, tím menší bude časové vyhlazení.
0 - žádné časové vyhlazení.
motpn (true nebo false, výchozí = true)
Definuje metodu detekce pohybu.
false - detekuje pohyb z předchozího k aktuálnímu a z aktuálního k následujícímu snímku (stará metoda použitá ve všech verzích před 3.0)
true - detekuje pohyb z předchozího k následujícímu snímku (nová metoda od verze 3.0)
seg (od 0 do 2, výchozí=2)
Ovládá metodu odstraňování segmentů skvrn.
0 - odstraní jen pixely, které nejsou překryty zónami pohybu (stará metoda použitá ve všech verzích před 3.0, nejsilnější odstraňování);
1 - odstraní jen takové čarové segmenty, které nejsou překryty zónami pohybu;
2 - odstraní jen takové celé skvrny, které nejsou překryty zónami pohybu (nejbezpečnější).
color (true nebo false, výchozí = false)
Ovládá korekci barev na místech odstraněných skvrn.
true - mění barvu pixelů na místech odstraněných skvrn na střední hodnotu z předchozího, aktuálního a následujícího snímku,
false - nemění barvu pixelů na místech odstraněných skvrn.
mscene (od 0 do 100, výchozí=40)
Nastavuje procento pixelů v pohybu pro detekci změny scény a vypnutí odstraňování skvrn ze snímku.
extmask (výchozí none)
Volitelný klip s externí maskou. Bude binarizován s prahovou hodnotou 127 a logicky přidán (operací "NEBO")
k vnitřní masce pohybu.
Může být použit pro doplňkovou ochranu dobrých objektů (pokud máte nějakou vhodnou masku).
mthres (výchozí 16)
Pixel se musí lišit od jiného snímku nejméně o 'MTHRES' , aby byl považován za pohyblivý. Toto číslo by mělo být
větší než 'P2' aby se zabránilo identifikování šumu jako pohybu.
mwidth (výchozí 7)
mheight (výchozí 5)
Toto definuje šířku a výšku bloku pro mapu pohybu odšumovacího algoritmu (erozivní a dilatační cestou).
merode (výchozí = 33)
Tento definuje prahovou hodnotu procenta pohyblivých pixelů v bloku ve stadiu eroze.
interlaced (true nebo false)
Zda zpracovat video jako prokládané nebo ne (progresivní). Výchozí je pro DeSpot false (progresivní) od verze 1.3.
(Ve starších verzích bylo ve výchozím nastavení video založené na polích zpracováváno jako prokládané - a to byla chyba).
Aby jste namísto odstraňování skvrn viděli mapu pohybu a šumu, který by byl eliminován, použijte parametr:
show (0, 1, 2, výchozí=0)
0 - nezobrazuje,
1 - jen zvýrazní šum, místo jeho odstranění
2 - zobrazí mapu pohybu a šumu
Pokud show=1, můžete použít doplňkový parametr pro změnu barev zvýraznění,
mark_v (0 až 255, výchozí= 255)
Kde mark_v je hodnotou jasu pro zvýraznění šumu.
Barva šumu (růžová, zelená nebo šedá) nyní závisí na paritě (sudosti) mark_v.
Také je zobrazena mapa pohybu sníženým kontrastem.
Pokud show=2, jas je změněn následovně:
255 (bílá): Šum, který bude odstraněn
159: Šum, který nebude odstraněn, protože by to mohl být pohyb
95: Mapa pohybu pro aktuální obraz
show_chroma (true nebo false)
Použijte pro zobrazení barevných dat klipu v mapě pohybu.
planar : znak pro použití speciálního planárního barevného formátu pro YUY2 klipy, jak na vstupu tak na výstupu funkce.
Používá speciální trik pro zachování snímků s planární barevnou organizací dat
(samostatné plochy Y, U, V v paměti) v normálním prolínaném formátu YUY2 snímků jako kontejneru.
Tak se můžeme vyhnout četným vnitřním převodům prolínaného formátu do planárního a zvýšíme tím rychlost.
Můžete převést normální prolínaný YUY2 zdrojový klip do planárního formátu pomocí funkce interleaved2planar
z pluginu RemoveGrain od kassandro,
a převést finální výsledek pomocí funkce planar2interleaved
.
Tento speciální planární YUY2 formát je podporovaný také v pluginu Removegrain od Kassandro, pluginu MaskTools2 od Manao a některých dalších.
Tento trik nebude potřeba v Avisynthu v2.6 s nativní podporou planárního YV16 formátu.
Tento parametr je ignorován u YV12 klipů.
Výchozí je planar=false (a vyskočí vám pro YUY2 chyba).
Aby filtr pracoval dobře, MUSÍ být správně nastaveny různé parametry. Neexistují dobré výchozí hodnoty.
První parametr, který potřebujete nastavit je interlaced, nastavte ho na true pokud je vaše video prokládané, jinak nechte false.
Pak musí být nastaveny pwidth a pheight. Nastavte je aby byly mírně větší než skvrny, které chcete odstranit. Pokud je vaše video prokládané, tak výška reprezentuje výšku jednoho pole. Tedy bude v podstatě zdvojnásobena.
Pak je potřeba nastavit p1, p2, a mthres . Obecně je p1 > mthres > p2. Pokud jsou nastaveny příliš nízko, tak by jste mohli ztratit detaily, protože malé variace pixelu mohou být chybně považovány za skvrny, a ještě důležitější je, že skutečné skvrny nemusí být rozpoznány, protože velikost toho co filtr bere jako skvrnu může být větší než pwidth na pheight. show=1 nebo 2 by mohlo být užitečné při nastavování těchto parametrů.
Parametry mwidth, mheight definují rozsah vlivu zón pohybu na zóny šumu (skvrn). Pro snížení chybných detekcí skvrn ve scénách s rychlým pohybem, je můžete zvýšit. Potom, pro zrušení vlivu velmi malých zón pohybu, můžete zvýšit parametr merode (relativně) .
Pak můžete nastavit parametr sign , pokud jsou téměř všechny skvrny bílé nebo jen černé. Správné nastavení sníží počet chybných detekcí skvrn a artefaktů.
Doporučuji použít nový parameter ranked=true pro stabilitu detekce skvrn v zašumělém videu.
Použijte parameter maxpts jako další metodu (navíc k pwidth a pheight) jako ochranu před vymazáním příliš velkých objektů - pravděpodobně ne skvrn.
Použijte p1percent pro nevymazání slabých (málo kontrastních) skvrn s malým relativním počtem kontrastních bodů (podle p1 ).
Pro lepší odstranění částečně poškozených pixelů blízko neostrých hranic skvrn můžete zvýšit velikosti skvrn zvýšením parametru dilate.
Zapněte korekci jasu v místech smazaných skvrn parametrem fitluma.
Tato korekce je lokální (založená na čárových segmentech) v režimu seg>0 a musí být použita s řádně definovaným rozšířením skvrn, aby se zabránilo chybné korekci kvůli neostrým hranám skvrn.
Pro snížení viditelnosti některých okrajů na místech smazaných skvrn o trochu více, nastavte lokální prostorové vyhlazení parametrem blur.
Pro odšumění téměř statických oblastí zkuste použít časové vyhlazení s parametrem tsmooth kolem 4-8.
Pokud mají skvrny nějakou barvu, zkuste zapnout parametr color pro opravu barev skvrn.
Pro zabránění artefaktů ve změnách scény, snižte parametr mscene .
Také můžete zkusit použít klip s externí maskou (parametr extmask ) jako doplněk (nebo náhradu) vnitří masky pohybu pro ochranu dobrých objektů. Například to může být maska pohybu invertovaná SAD maska z pluginu MVTools.
1a) Nachází pixely, které se liší od jejich sousedů aspoň o p1.
Pokud je prametr ranked true (nová metoda od verze 1.2), 3 sousedi v předchozím snímku (x-1, x, x+1)
a stejní 3 sousedi v následujícím snímku jsou seřazeni (podle hodnoty), a jejich minimum a maximum se použije pro výpočet aktuálního rozdílu jasu od pixelu (x).
Pokud je parametr ranked false (stará metoda), použije se jen jeden soused v předchozím snímku (na stejné pozici x) a jeden soused v následujícím
snímku pro výpočet minima a maxima.
Pokud není parametr sign roven 0, zahrnuje se také znak (sign) rozdílnosti.
Tyto pixely jsou sloučeny do horizontálních čárových segmentů.
Shluky čárových segmentů jsou sloučeny do skvrn.
1b) Zvětšuje okolí zárodku p2<p1.
2a) Určuje velikost skvrn a vyhazuje (neočistí) všechny větší než pwidth x pheight.
Pokud je parametr numpts nastaven, velké skvrny jsou také vyloučeny ze zpracování.
Pokud je nastaven parametr p1percent , pak slabé (podle kritéria p1) skvrny, které většinou sestávají z okolí (podle kriteria p2), jsou také vyloučeny.
2b) Pokud je nastaven režim Dilate , tak jsou skvrny rozšířeny aby zakryly své nekontrastní hrany a malé prodlevy mezi nimi, pomocí operace morfologického rozšíření k mapě šumu (skvrn).
3a) Najde pohyblivé oblasti v obrazu jednoduchým porovnáním každého pixelu s jiným snímkem a zkoumá všechny ty, které
jsou větší než mthres.
Pokud je motpn=false, definuje se pohyb od předchozího k aktuálnímu snímku,
pokud je motpn=true, definuje se pohyb od předchozího k následujícímu snímku.
3b) Označí pohybové pixely bez šumu s váhou 3 v mapě pohybu.
Pokud je motpn=false, označí pixely určené jako pohyb i šum s váhou 1 na mapě pohybu.
4) Odstraňuje šum i malé oblasti z mapy pohybu erozivní metodou a pak i jejich rozšíření (protože to je vše morfologické otvírání).
Ve fázi eroze je mapa pohybu erodována v rozsahu mwidth/2 a mheight/2,
a zóny s malou sumární váhou (menší než 3*merode/100) jsou sníženy nebo úplně odstraněny z mapy pohybu. Takové zóny odpovídají
malému relativnímu (v procentech) počtu pohyblivých sousedů uvnitř tohoto rozsahu (nebo většině šumových pixelů - skvrnám).
Ve fázi rozšiřování jsou zbývající zóny pohybu zvětšeny se stejným rozsahem. To jsou pravděpodobně nejdůležitější kroky (obzvláště pro motpn=false) .
4a) Jestliže procento pohyblivých pixelů je větší než parametr mscene , plugin detekuje změnu scény, a celá mapa pohybu je nastavena jako pohyblivá.
4b) Přidává volitelnou externí masku pro maskování pohybu.
5) Odstraňuje jen skvrny, ve kterých nebyl žádný pohyb (v aktuálním snímku nebo následujícím snímku jestliže motpn=false).
V režimu odstraňování pixelů (seg = 0), prověřuje a odstraňuje jen pixely, které se nepřekrývají zónami pohybu.
V režimu odstraňování segmentů (seg = 1), prověřuje a odstraňuje jen segmenty, které se nepřekrývají zónami pohybu.
V režimu odstranění skvrn (seg = 2), prověřuje a odstraňuje jen skvrny, které se nepřekrývají zónami pohybu.
Je to nejbezpečnější režim, s minimem artefaktů chybných odstranění.
6) Volitelně provede korekci jasu v místě odstraněných pixelů a prostorové vyhlazení blízko okrajů skvrn.
7) Volitelně provede časové vyhlazení statických oblastí.
8) Volitelná korekce barev v místě skvrn.
1) Nalézá pohyblivé oblasti obrazu prostým porovnáním každého pixelu s předchozím snímkem a uvažuje všechny takové, které jsou větší než mthres.
2) Odšumuje mapu pohybu erozí a pak rozšiřuje (t.j. morfologické otvírání). To je pravděpodobně nejdůležitější krok.
3) Použije prostý časový mediánový filtr na nepohyblivé části obrazu.
DeSpot je od verze 3.2 ručně optimalizován pro Integer SSE (Pentium3, Athlony jsou nyní vyžadovány).
Urychlení je asi o 30%.
Fizick verze nad 1.1 jsou kompilovány ve free MS VC++ Toolkit 2003 s MS Platform SDK.
Poznámka: zkopírujte ztracené nmake.exe a cvtres.exe ze složky Bin\win64 do složky Bin.
MS VC6, VC7 mohou být také použity.
Použijte soubor "makefile.exe" s příkazem: nmake
Staré verze C-pluginu do 1.3 mohou být kompilovány pomocí GCC-g++ 3.3.1, MinGW 3.0.0-1, MSYS 1.09. Nové verze nad 2.0 tak kompilovat nelze.
Velmi dobrých výsledků je možné dosáhnout kombinací tohoto filtru s odhadem a kompenzací pohybu: globálního pohybu s pluginem DePan (od Fizick), nebo lokálního pohybu s pluginem MVTools (od Manao).
V takovém případě jsou pixely z předchozího a následujícího snímku posunuty, aby nejlépe zapadly do aktuálního snímku, čímž se snižuje relativní pohyb, sníží se chybné detekce skvrn, a zlepší se redukce šumu.
Příklad skriptu s DePan 0.9 (můžete nastavit volitelné parametry DePanEstimate a DepanInterleave):
AviSource("h:\kino.avi") LoadPlugin("depan.dll") LoadPlugin("despot.dll") i = ConvertToYV12() d = DePanEstimate(trust=3) DePanInterleave(i, data=d) DeSpot(p1=30, p2=15, pwidth=800, pheight=600, mthres=20, motpn=true, dilate=1, seg=1) SelectEvery(3, 1)
Příklad skriptu s MVTools 0.95 (můžete nastavit volitelné parametry MVAnalyse):
AviSource("h:\kino.avi") LoadPlugin("mvtools.dll") LoadPlugin("despot.dll") i = ConvertToYV12() vf = MVAnalyse(i, isb=false, lambda=2000) f = MVCompensate(i, vf) vb = MVAnalyse(i, isb=true, lambda=2000) b = MVCompensate(i, vb) Interleave(f, i, b) DeSpot(p1=30, p2=12, mthres=20, dilate=2, fitluma=true, blur=2, seg=2) SelectEvery(3,1)
Příklad skriptu s externí maskou z pluginu MVTools v0.9.13.2 a výše (můžete nastavit volitelné parametry MVAnalyse):
LoadPlugin("mvtools.dll") LoadPlugin("masktools.dll") LoadPlugin("degrainmedian.dll") LoadPlugin("despot.dll") AviSource("h:\kino.avi") i = ConvertToYV12() prefilt=i.DeGrainMedian() # předfiltrováno pro lepší analýzu pohybu # analyzujeme a kompenzujeme pohyb vpřed a zpět (k aktuálnímu snímku) ml = 100 # měřítko masky thscd1 = 400 # změna scény vf = prefilt.MVAnalyse(isb=false, truemotion=true) # dopředné vektory cf = i.MVFlow(vectors=vf, thscd1 = thscd1) # předchozí snímek, kompenzovaný vpřed sadf = MVMask(vectors=vf, ml=ml,kind=1,gamma=1, thscd1 = thscd1) # maska SAD vpřed msadf=sadf.Binarize() # binární invertovaná maska SAD vpřed vb = prefilt.MVAnalyse(isb=true, truemotion=true) # zpětné vektory cb = i.MVFlow(vectors=vb, thscd1 = thscd1) # následující snímek, kompenzovaný zpět sadb = MVMask(vectors=vb, ml=ml, gamma=1, kind=1, thscd1 = thscd1) # maska SAD zpět msadb = sadb.Binarize() # binární invertovaná maska SAD zpět msad = Logic(msadf,msadb,"OR") # kombinovaná invertovaná maska SAD msad = msad.Expand() # rozšířená invertovaná maska SAD msadi = Interleave(msad, msad, msad) # 3krát opakovaná invertovaná maska SAD # Tato maska je vysoká (255) kde je nejméně jeden odhad pohybu dobrý, # takže tyto oblasti budou chráněny Interleave(cf,i,cb) # prolínáme (řadíme) dopředně kompenzovaný, zdrojový, a zpětně kompenzovaný snímek DeSpot(p1=30,p2=12,pwidth=800,pheight=600,mthres=20,merode=33,\ sign=0,show=1,seg=0,color=true,motpn=true, extmask=msadi) SelectEvery(3,1) # dostaneme filtrovaný zdroj
Diskuze o filtru ConditionalTemporalMedian a filtru Despot : http://forum.doom9.org/showthread.php?s=&threadid=59388
Tento program je svobodný software; můžete ho redistribuovat a/nebo opravovat pod podmínkami GNU General Public License publikované Free Software Foundation; buď verze 2 Licence, nebo (podle vaší volby) některé pozdější verze.
Tento program je šířen v naději, že bude užitečný, ale BEZ JAKÉKOLI ZÁRUKY; dokonce bez předpokládané záruky OBCHODOVATELNOSTI nebo POUŽITÍ PRO KONKRÉTNÍ ÚČELY. Viz GNU General Public License pro více podrobností.
Spolu s tímto programem by jste měli obdržet kopii GNU General Public License; pokud ne, napište do Free Software Foundation. Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Dokumentace je šířena pod CreativeCommons BY-SA 3.0 license.Zvažte prosím dotaci, aby jste se stali registrovaným uživatelem.
$English Date: 2006/12/15 19:29:25 $
Český překlad:25.2009