aplikace pro interaktivní opravy defektů ve filmovém záznamu
© Vít Čondák 2018-2022
Program PNG-Denny je určený k opravám škrábanců ve starších filmech. Není ovšem vhodný k opravám fotek, protože pro svou činnost potřebuje více podobných snímků.
Některé opravy je možné provést automaticky, jiné je možné provádět ručně (tj. klikáním myši).
Z ne zcela jasných příčin jsem v programu všude použil anglické popisy a k napsání přepínání jazyka jsem se zatím neodhodlal. =}
Program záměrně nepracuje přímo s komprimovaným video souborem, protože většina video souborů používá ztrátovou kompresi a při každém zpětném ukládání upravených snímků by nevyhnutelně docházelo k jejich zkreslení kompresním algoritmem.
Program proto jako pracovní materiál používá snímky vyexportované do formátu .png.
Sám export snímků neprovádí, takže je pro export potřeba použít jiný program - nejlépe volně dostupnou utilitu FFMPEG.
Aktuální verzi je možné stáhnout na ffmpeg.org
Utilita se ovládá z příkazové řádky a příkaz k rozbalení všech snímků vypadá přibližně takto:
ffmpeg -i "jméno-video-souboru.mp4" %06d.png
Jméno video souboru se bude samozřejmě lišit podle toho, jaký soubor chcete upravit. =)
Druhý parametr udává formát, jak se budou soubory s obrázky jmenovat. "%06d" znamená, že jména budou šestimístná čísla (000000-999999), což by mělo obvykle bohatě stačit na běžný film. (Při obvyklých 25 snímcích za vteřinu a stopáži 90 minut se dostaneme na 135 000 snímků. V extrémních případech by bylo třeba jméno prodloužit na 7 číslic a parametr by tedy byl "%07d".)
Raději upozorňuji, že rozbalené snímky samozřejmě zaberou spoustu místa na disku, takže je třeba s tím počítat. Velikost každého snímku se liší v závislosti na rozlišení a jeho složitosti, ale u černobílého filmu se pravděpodobně bude pohybovat mezi 1 až 2 MB, takže pro rozbalení celého filmu je obvykle potřeba zhruba 250 GB volného místa. (A samozřejmě dalších 250 GB pro případné záložní kopie nebo pracovní verze.)
Pokud jsou součástí videa černé okraje (např. video má rozměr 1920x1080 (16x9), ale využitá část obrazu jen 1440x1080 (4x3), takže na obou stranách jsou černé okraje široké 240 pixelů), tak je vhodné okraje přímo při extrakci ořezat, protože se tím zmenší velikost všech souborů na disku a navíc díky tomu budou všechny následující operace trochu rychlejší.
Příkazový řádek pak bude vypadat například takto:
ffmpeg -i "jméno-video-souboru.mp4" -vf "crop=1440:1080:240:0" %06d.png
("Crop" znamená ořezání, první číslo (v tomto případě 1440) je šířka výsledné oblasti, druhé číslo (1080) její výška a zbývající dvě čísla (240 a 0) udávají posunutí levého horního rohu ořezané oblasti oproti originálu.)
Většina filmů obsahuje i zvukovou stopu, takže je vhodné si ji také vyexportovat do samostatného souboru. Pokud budete audio také nějak upravovat (to PNG-Denny neřeší), tak je vhodné použít formát WAV:
ffmpeg -i "jméno-video-souboru.mp4" audio.wav
Jinak je možné použít i export původní audio stopy bez dekomprese. Např.
ffmpeg -i "jméno-video-souboru.mp4" -vn -acodec copy audio.aac
Program PNG-Denny je napsaný v C# a používá .NET, takže je poměrně malý a není třeba ho instalovat, ale stačí ho nakopírovat do adresáře, kde máte rozbalené snímky, a spustit ho. Program bude pracovat se všemi .png soubory, které v tom adresáři najde, a to v pořadí podle abecedy.
Pro používání programu je dobré udělat si alespoň přibližnou představu, jak uvnitř funguje, jaké jsou jeho schopnosti a jaká omezení.
Při psaní jsem vycházel z toho, že u filmu jsou obvykle po sobě následující snímky velmi podobné, takže program u většiny činností pracuje s trojicí snímků - aktuální políčko, jeho předchůdce a následovník.
Porovnáním této trojice se snaží na aktuálním políčku najít poškozená místa a opravit je pomocí částí jeho sousedů.
To funguje poměrně dobře u statických záběrů, které neobsahují příliš mnoho pohybu a kazů. V opačném případě může mít program problém rozpoznat, co je pohyblivý objekt a co chyba nebo který obrázek je ten "správný" a který poškozený.
Statické záběry je možné poměrně úspěšně opravovat automaticky, kdežto pohyblivé části obvykle vyžadují ruční práci a především kontrolu lidským okem. Většinou je poměrně snadné nějakým způsobem poškozené místo opravit, ale často je problém automaticky určit, které místo obrázku je poškozené. Zvlášť nepříjemné jsou střihy, rychle se pohybující objekty, náhlé změny osvětlení nebo lesklé předměty, které do kamery "házejí prasátka".
Program bohužel nedokáže jednoduše opravit případy, kdy je stejným způsobem poškozeno více po sobě jdoucích políček (například ožehnutý okraj) a jen omezeně je možné opravovat dlouhé svislé škrábance (následující políčka jsou obvykle poškrábaná na stejných místech, takže je pro opravu není možné použít.)
Levým tlačítkem myši je možné provádět ruční opravy (viz níže), kdežto pomocí pravého tlačítka je možné snímek posouvat (pokud je v aktuálním zobrazení příliš velký).
Kolečko myši umožňuje obrázek přiblížit nebo oddálit a klávesou F5 lze zapnout automatické přizpůsobení velikosti obrázku velikosti okna.
Při pohybu kurzoru po obrazovce se na dolní liště průběžně vypisují jeho souřadnice v rámci obrazovky, pozice pixelu v obrázku a jeho RGB hodnoty (případně v režimu náhledu jeho spolehlivost a podobně).
Klávesou F11 je možné vypnout nebo zapnout zobrazení lišt a zvětšit tak pracovní plochu.
Kurzorové šipky posouvají pozici v seznamu obrázků o jeden snímek. Ctrl+šipky posouvají o deset snímků, Alt a Shift délku skoku zvětšují na 100 a 1000 snímků.
Standardně je zapnutá funkce Autosafe, takže pokud jste na políčku provedli nějaké změny, tak při přesunu jinam se soubor automaticky přepíše. Pokud vám toto chování nevyhovuje, tak může funkci Autosafe vypnout a políčka ukládat ručně (tradičně CTRL+S).
Jakékoliv automatické výpočty je možné spustit na aktuálním snímku (F7) nebo s automatickým posunem dopředu (F8) nebo dozadu (F6).
Akce začínající slovem "Show" slouží k zobrazení náhledů různých pracovních polotovarů a nemění aktuální obrázek. Ten mění pouze akce začínající slovem "Fix".
K dispozici jsou tyto akce:
Zobrazí náhled obrázku vytvořeného zprůměrováním sousedních políček. Extrémně odlišná místa jsou zabarvena růžově.
Zobrazí náhled obrázku vytvořeného zprůměrováním sousedních políček se zeleně zabarvenými místy, která se příliš liší a jsou tedy pro další výpočty považována za nespolehlivá.
Zobrazí náhled aktuálního obrázku s červeně označenými podezřelými místy.
Zobrazí náhled možných změn s fialovým ohraničením
Provede změny přímo v aktuálním obrázku.
Pokusí se celý snímek trochu posunout tak, aby se oproti svým sousedům příliš nechvěl.
Pokusí se celý snímek trochu posunout tak, aby se co nejvíce přiblížil vzorovému (master) snímku, který je samozřejmě třeba nejprve vybrat a nastavit.
V mezích možností se pokusí odstranit logo. Lze použít, pokud logo leží v horní části obrazovky a je poloprůhledné. Nejprve je třeba logo izolovat (Set logo) na políčku, které je jinak zcela černé, a program pak logo "odečítá" a snaží se odpovídajícím způsobem upravit pozadí. Úspěšnost a přesnost je hodně závislá na kvalitě vstupu - na okraji loga při kompresi videa nevyhnutelně vznikají kompresní artefakty, které není možné dokonale odstranit, takže záleží na tom, jak jsou výrazné.
Kompezace světlosti pozadí po odstranění může proběhnout automaticky, ale prakticky je obvykle lepší nechat ji jednou nechat spočítat a podle výsledku ji pak ještě ručně doladit. (Pokud je pozadí loga příliš členité, tak se výpočet často nedobere správného výsledku.) Pokud je pozůstatek loga po odstranění příliš tmavý, tak je potřeba nastavit vyšší hodnotu kompenzace, kdežto u světlého zbytku je třeba hodnotu naopak snížit.
Změna úrovní se hodí v případě, že je snímek příliš světlý, tmavý nebo málo kontrastní.
Zopakuje poslední akci (opravu) provedenou myší. Použití je vhodné především pro opravy dlouhých svislých škrábanců, které se táhnou přes mnoho políček a stále zůstávají na stejné pozici.
Automatické opravy fleků jsou pravděpodobně nejdůležitější funcí a navíc mají poměrně hodně podivných parametrů, které velmi ovlivňují časovou náročnost a kvalitu výsledku, takže pro snadnější nastavení jsou připraveny dva "presety":
Pokud některý z parametrů ručně změníte, přepne se preset do stavu Custom.
Jednotlivé parametry:
Limit spolehlivosti při porovnávání sousedních políček. Hodnota udává přibližný rozdíl jasu na stupnici od 0 (černá) do 255 (bílá). Vyšší čísla znamenají, že program bude za spolehlivé považovat i oblasti, které se více liší. Pravděpodobně tedy upraví více míst, ale současně se zvýší pravděpodobnost, že dojde k nežádoucím změnám.
Hranice jasu (opět ze stupnice 0-255) mezi aktuálním obrázkem a průměrem sousedů pro opravy. Pokud je rozdíl jasů na daném místě vyšší a současně je to místo považováno za spolehlivé, tak dojde k jeho opravě.
Oblasti, které neprošly stastickým porovnáním, je možné zkusit opravit pomocí posunutých částí z okolí a D udává maximální vzdálenost v pixelech, do jaké se vyhledávají potenciální posunuté oblasti. Číslo 0 znamená, že se posunuté oblasti vůbec nehledají, takže tenhle parametr má největší vliv na délku výpočtu.
Hraniční limit rozdílu jasů při vyhledávání posunutých oblastí.
Koeficient důvěryhodnosti okolí. Vyšší číslo by mělo výsledek zpřesnit, ale také zpomalit výpočet.
Požadovaná přesnost při hledání posunů.
Obvykle stačí kliknout myší na poškozené místo a program se ho pokusi opravit. Program kontroluje shodu okolí a jeho velikost závisí i na velikosti štětce, takže pokud to nezabere, zkuste nastavit větší "štětec" a kliknutí zopakujte nebo klikněte na trochu jiné místo. Je také možné nastavit větší toleranci na shodu sousedních políček. Pokud víte, že obraz se v daném místě nehýbe, je možné vypnout vyhledávání podobné oblasti (Position). Pokud světlost sousedních políček kolísá, může pomoct v lepšímu výsledku zapnutí korekce světlosti (Lightness). (Aplikuje se ovšem až po vyhledávání shody, takže nepomáhá v případech, že program nemůže na sousedních obrázcích najít shodu právě kvůli velkému rozdílu světlosti celých políček.)
Kliknutím a potáhnutím myši je možné zkopírovat část snímku na jinou pozici (klonování). Funkce se řídí nastavením zdroje pro štětec, takže standardně používá jako zdroj aktuální snímek, ale pokud nastavíte u štětce jako zdroj jen předchůdce nebo jen následovníka, bude se jako zdroj klonované oblosti používat daný sousední snímek.
Pomocí kombinace kláves Alt + kurzorové šipky je také možné v případě potřeby ručně upravovat pozici celého snímku, ale je třeba počítat s tím, že na jednom okraji zůstanou původní pixely, které je pak třeba opravit nějakým jiným způsobem.
K vyhledávání podezřelých míst je možné použít klávesu F3. Pokud nějaké takové místo existuje, program na něj přesune kurzor myši a (pokud se skutečně jedná o obrazový kaz) pro opravu pak obvykle stačí pouze kliknout myší. Pro automatické vyhledávání v celé sekvenci je možné použít klávesy F2 (směrem dozadu) a F4 (směrem dopředu).
Optimisté mohou použít i pseudomanuální opravu. Ctrl+F3 projde všechna podezřelá místa v aktuálním snímku a pokusí se kliknutím (s aktuálně nastaveným štětcem) opravit. Nevýhodou je, že může dojít ke změně mnoha míst, která ve skutečnosti nebyly kazy. Ctrl+F4 pak spustí totéž na všech políčkách směrem dopředu.
Nejprve je potřeba upravené snímky spojit do nového videosouboru bez zvuku:
ffmpeg -framerate 25 -i %06d.png -c:v libx264 -pix_fmt yuv420p -preset slower -crf 20 nove-video-bez-zvuku.mp4
Pak následuje spojení se zvukovou stopou:
ffmpeg -i nove-video-bez-zvuku.mp4 -i audio.aac -c copy nove-video-se-zvukem.mp4
2019-05-30 první úsporná verze zahrnující především přípravu
2019-06-03 doplněno sekce navigace, parametry automatu a upraveno formátování + obrázek
2019-08-23 extrakce snímků s ořezáním
2019-12-11 doplněny informace o Set position, Fix logo a Repeat action
2020-10-30 doplněny detaily ke kompezaci pozadí po odstranění loga
2021-07-26 Ctrl+F3 a Ctrl+F4
2022-12-07 Adjust levels