SimpleResize

Přehled

autor: Tom Barry
verze: 0.3.3.0
stáhnout: http://www6.impacthosting.com/trbarry/downloads.htm, http://www.avisynth.org/warpenterprises/
kategorie: Filtry pro změnu velikosti
požadavky: YV12 & YUY2 Barevné prostředí

Popis

SimpleResize je Avisynth filtr, který provede velmi jednoduchou 2 vývodovou (tap) lineární interpolaci. Je nefiltrovaný, což znamená, že moc nezměkčuje.

InterlacedResize & InterlacedWarpedResize jsou navrženy pro práci s prokládaným materiálem (více na konci dokumentace).

Jeho hlavní výhodou je, že poběží o něco rychleji než jiné.

Aby jste ho použili prostě:

použijte ve vašem Avisynth souboru příkazy podobné těmto

LoadPlugin("F:\SimpleResize\SimpleResize.dll")
Avisource("D:\kdekoli\mujsoubor.avi")
SimpleResize(width, height)

Samozřejmě nahraďte jména souboru a složek vašimi vlastními a doplňte celá čísla za width & height.

SimpleResize by měl běžet na všech MMX strojích. Obsahuje také nějaký (volitelný) kód pro SSE2 instrukce k práci na P4 a také nějaký kód pro SSEMMX k práci na P3 & Athlonech, jestliže je používají. Lituji, ale neplánuji zvláštní kód pro 3DNow.

WarpedResize

WarpedResize je do SimpleResize.dll také zahrnut. WarpedResize provede nelineární protažení/stlačení jak v horizontálním tak vertikálním rozměru. To může být užitečné, když chcete změnit poměr stran video klipu a mít ho nejvíc zdeformovaný nahoře, dole, a na bočních stranách. Je to především experimentální filtr, ale přidal jsem ho, protože jsem potřeboval nějaké změny kódu a ty se téměř nedotkly výkonu. Použijte ho takto:

LoadPlugin("F:\SimpleResize\SimpleResize.dll")
AviSource("D:\kdekoli\mujsoubor.avi")
WarpedResize(width, height, hWarp, vWarp)

kde hWarp & vWarp jsou horizontální a vertikální deformační (warp) součinitele. Jsou to reálná čísla, obvykle mezi 0.8 a 1.3 , které určují jak nelineární výstup opravdu chcete.

Hodnoty nad 1.0 způsobí, že výstupní obraz bude více ve středu a potlačen na okrajích. Hodnoty pod 1.0 budou dělat opak. Zadáním 1.0 pro jeden z nich provede lineární změnu velikosti v daném rozměru, právě jako kdyby jste použili SimpleResize. Hodnoty daleko od 1.0 dají některé velmi zvláštní výsledky. Viz. "Poznámky pro Matematiky" níže.

Jeden důvod pro použití WarpedResize by byl, když máte klip s poměrem stran 16:9 a chcete změnit velikost na poměr stran 4:3 bez vyříznutí cenných informací nebo bez nutnosti zobrazovat černé pruhy. (nebo naopak)

Příklad obrazu s použitím WarpedResize pro tento účel je (prozatím) na www.trbarry.com/warptest.jpg. Tento obraz byl z krátké HDTV digitální nahrávky, která měla rozlišení 1280x720, a poměr stran 16:9. Byl zmenšen a deformován (warped) na 640x480 s poměrem stran 4:3 , použitím následujícího skriptového příkazu:

WarpedResize(640,480,1.15,0.95))

Také například nahrávka 4:3 deformovaná na 16:9 obrazovku vypadá takto www.trbarry.com/Warptest2.jpg

Současná omezení pro SimpleResize/WarpedResize

1) V současnosti je podporován jen YUY2 barevný režim. Pokud je to potřeba přidejte napřed příkaz ConvertToYuY2.

2) Cílová šířka už NEMUSÍ být dělitelná 4 pixely.

3) Poběží rychleji na SSE2 strojích, pokud bude cílová šířka dělitelná 8 pixely a pokud data začínají na 8 pixelové hranici. Nevím jestli ho dřívější použití příkazu Clip() ovlivní nebo ne.

4) Jestli někdo ví, jak z tohoto filtru udělat DirectShow filtr byl bych rád kdyby se o to se mnou podělil. ;-)

Poznámky pro matematiky: (a otázky)

Představte si obrazovku s rozměry od -1.0 do 1.0. Prozatím budeme uvažovat jen horizontální rozměr a jen pravou polovinu obrazovky. Dejme tomu, že chceme vypočítat hodnotu výstupního pixelu v místě x, kde 0 <= x <=1.

Výstupní hodnota bude zdrojová hodnota pro vstupní obrazovku se stejnými rozměry v místě s. Teď prostě vypočítáme s = (1-w) * x^3 + w * x, kde w je deformační (warp) součinitel zmíněný výše (Pozdější poznámka: w = 2 - warp součinitel, pro kompaktnost s prvním vydáním). Toto provede svou práci a vytváří plynulá čísla od 0 do jedné, bez velkého pokřivení dokud je w poblíž 1.0.

Stejná formule odráží práci v levé polovině obrazovky.

Deformační rovnice jsou navrženy tak aby:

* Vždy rostly, ale dávaly výsledky od 0 do 1

* Jsme měli první odvozeninu, která se neblíží k 0 nebo nekonečnu, a pokud možno poblíž středu obrazovky

* Jsme měli křivku (absolutní hodnota 2. odvozeniny), která je malá uprostřed a plynule se zvyšuje směrem ke krajům. Chtěli bychom křivku, aby byla kdekoli = 0 když je warp součinitel = 1

Řekl bych, že křivka je více či méně určena absolutní hodnotou druhé odvozeniny. Takže pokud jsme chtěli malou křivku při x = 0 a aby se zvyšovala směrem k okrajům, jaká deformační (warp) funkce by byla užitečná? Funkce výše už reprezentuje změnu od V 0.1 , ale stále si nejsem jistý jestli je nejlepší.

Je snadné napsat ještě jednu deformační funkci. A přitom není žádná ztráta výkonu, protože je to vypočteno a zaneseno do tabulek při spuštění. Poté to běží stejnou rychlostí jako SimpleResize.

Má někdo nějaký nápad? (Zajímá někoho tato část?)

InterlacedResize a InterlacedWarpedResize

Pokud chcete změnit velikost prokládaného zdroje, můžete použít toto:

InterlacedResize (width, height)

nebo

InterlacedWarpedResize (width, height, hWarp, vWarp)

Obě funkce mají stejné parametry jako předchozí, ale jsou navrženy pro práci s prokládaným zdrojem bez smíchání (blending) dat sudých/lichých polí a bez popletení souřadnic kvůli posunům sudých/lichých řádků. Teoreticky mohou ztratit malé množství vertikálních detailů nebo zmást další deinterlační nebo IVTC funkce, ale dosud jsem ve svých testech nenašel takové problémy.

Takže pokud zamýšlíte zachovat vaše video v prokládané podobě, určitě toto použijte. A pokud zmenšujete můžete si všimnout, že stojí za to provést napřed InterlacedResize před náročnějším odstraňováním prokládání, protože získáte malou výkonovou výhodu. Ale je to stále experimentální. YMMV.

$English Date: 2005/06/09 20:43:30 $

Český překlad:30.4.2009