# Blockbuster

## Přehled

autor: Ross Thomas
verze: 0.7
stáhnout: http://kvcd.net/sansgrip/avisynth/, http://www.avisynth.org/warpenterprises/
kategorie: Různé pluginy
požadavky: YV12 & YUY2 Barevné prostředí

## Popis

Blockbuster je Avisynth filtr navržený pro snížení nebo eliminaci DCT bloků z komprimovaných materiálů. Když se DCT bloky, také známé jako "temné bloky" (česky kostkatění) objeví v oblastech nízkého jasu (luma) snímku, jsou to ošklivé, rozptylující artefakty které MPEG enkodéry rádi volně rozptylují v našich jinak bezchybných kompresích.

Zatímco se závažnost problému mění s různými verzemi MPEG, u MPEG-1 ukazuje nejvíce DCT bloků a MPEG-4 nejméně, vyskytují se ve všech verzích. MPEG-1 je produkuje téměř kdekoli kde je rovinná plocha s nízkou úrovní detailů (jako zeď), a MPEG-2 je zobrazuje ve stejných oblastech, ale méně často (jsou v zásadě vidět při nižších datových tocích, jak si může každý kdo má zkušenosti s digitálním vysíláním ověřit). MPEG-4 má výrazně méně problémů s nízkými úrovněmi detailů, ale stále produkuje DCT bloky, obzvláště v tmavých oblastech (viz. toto vlákno na Doom9 pro více informací o těchto blocích a MPEG-4).

(Ostatně, DCT sznamená "discrete cosine transform - diskrétní kosinová transformace", a je jednou z technik MPEG používaných k provádění komprese. Liší se od makrobloků, které jsou nejviditelnější v oblastech s vysokým pohybem, když je nedostatečný datový tok pro přesný popis pohybu, a také od "mosquito" šumu, který je artefaktem, který se objevuje kolem hran a oblastí s vysokým kontrastem.)

Jak je uvedeno výše, příčinou těchto bloků se zdá být nedostatek detailů v oblastech obrazu, které enkodér "přehlédne" a proto použije příliš silnou kompresi. Ve zpracování byly detaily vyhlazeny a oblast se mění na DCT blok.

Cílem tohoto filtru je pokusit se vytvořit takové oblasti více "viditelné" pro enkodér, takže jim přiřadí více bitů a tak nepotřebuje tolik komprimovat. Ti vychytralí mezi vámi si uvědomí, že tento filtr je v podstatě navržen pro zvýšení datového toku (a snížení komprimovatelnosti) vašeho klipu. Ale to je pro většinu kardinální hřích, takže zde jsou alespoň dva pádné důvody pro jeho použití.

Za prvé, zatímco nejvyšší možný kompresní poměr je samozřejmě žádoucí, člověk musí zvážit cenu. Nikdo by nepřijal video s rozlišením 120x90, dokonce když každý ví, že by to mělo výborný kompresní poměr. Podobný efekt by byl dosažen vyhlazováním klipu dokud nebude vypadat jako by jste zapatlali monitor vazelínou, ale znovu by nikdo nepřijal takový obraz.

Mohlo by se argumentovat, že DCT bloky jsou podobně neakceptovatelné v kompresích dobré kvality. Názor lidí na to se hodně liší, ale zvyšující se počet, včetně mě, hledají jistý způsob jak je vyčistit. Tento filtr je mým příspěvkem k této snaze.

Za druhé, protože se kompresní technologie vyvíjí a zlepšuje, je občas nutné překódovat stará videa na nové, pokročilejší formáty. Odstranění artefaktů z existujících videí je mnohem obtížnější než zastavení jejich výskytu v první fázi. Tedy odstranění DCT bloků z vašich enkódování nyní usnadní rekompresi vašich videí později.

## Jak pracuje

Filtr rozděluje každý snímek na série bloků (uživatelsky konfigurovatelných rozměrů) a kontroluje postupně každý blok na množství detailů, které obsahuje. Pokud je úroveň detailů uvnitř definovaného rozsahu pak je blok zpracován v souladu s parametrem method (viz. část Použití níže).

## Použití

Existuje několik metod, které mohou potenciálně snížit nebo eliminovat DCT bloky: přidání šumu, zostření, a rozmazání. Tyto různé přístupy jsou připojovány pomocí parametru method , kombinovaném sadou parametrů sdílených všemi metodami stejně jako parametry specifickými pro každou z nich. Je také doplňková metoda zvaná "show" která zvýrazní každý blok, který bude ovlivněn filtrem.

Obecná forma jeho použití je

> `Blockbuster` (clip, method="...", sdílené parametry, parametry specifické pro metodu)

Parametr method může být buď "noise", "dither", "sharpen", "blur" nebo "show". Parametry specifické pro každou metodu budou uvedeny v kapitole Metody níže. Parametry běžné pro všechny metody jsou:

Parametr | Popis | Výchozí
--- | --- | ---
block_size | Určuje velikost bloků na které je každý snímek rozdělen před zpracováním. Hodnota reprezentuje jak šířku tak výšku bloku, a nemůže být menší než 3. | 8
detail_min, detail_max | Určuje množství detailů, které musí být přítomno v bloku, aby byl zpracován. Tato hodnota je procentuální, a může být mezi 1 a 100. Reprezentuje procento unikátních úrovní světlosti (jasu)) uvnitř bloku. Například, pokud block_size je nastaven na 8, každý blok obsahuje 64 pixelů. Pokud detail_min je 1 a detail_max je 50, blok bude zpracován jen, když obsahuje mezi 1 a 32 unikátními úrovněmi světlosti. Nastavení detail_min=1, detail_max=100 zpracuje celý snímek. | detail_min=1, detail_max=10
luma_offset, luma_threshold | Jasové pixely v rozsahu 0-luma_threshold budou posunuty o luma_offset uvnitř zpracovaných bloků. Například, pokud je luma_threshold 30 a luma_offset je -2, tmavé pixely (ty s jasem mezi 0 a 30 včetně) budou zmenšené o 2, a tím ještě mírně ztmavené. (Zdůvodnění: Bylo objeveno, že parametr lumoff pluginu mpeg2dec od Marc FD jak se zdá snižuje objevování MPEG-4 "tmavých bloků" -- DCT bloky v tmavých oblastech snímku -- dále. Tyto parametry jsou vytvořeny pro provádění stejné věci, ale omezují změnu světlosti jen na oblasti, které vypadají, že to potřebují.) | luma_offset=0, luma_threshold=25

## Metody

### method="noise"

Tato metoda přidává normálně šířený -- také známý jako Gaussův -- šum do klipu. Testování ukázalo, že Gaussův šum je daleko vhodnější pro účely tohoto filtru, než uniformně šířený šum.

S unifirmě šířeným šumem je každá možná hodnota stejně pravděpodobná jako jiná. To je, pokud generujete sekvenci čísel v rozsahu 1-100, v jakémkoli bodě sekvence asi vygenerujete 5 stejně jako 95.

"Normální šíření" znamená, že šance, že se objeví každá hodnota není stejná. Řekněme, že generujete normálně šířená čísla se středem v 0 a variací 1 (pro vysvětlení těchto termínů viz odkazy na konci paragrafu). Generátor může teoreticky vyplivnout jakékoli číslo, které může mít dvě desetinná místa, ale bráno v celku čísla budou v průměru nula (to je to co znamená mean=0). S těmito parametry asi 68% hodnot bude mezi -1 a 1, kolem 95% mezi -2 a 2, a kolem 99% mezi -3 a 3. Pravděpodobnost generování čísel, která jsou výrazně vyšší nebo nižší je opravdu velmi malá, proti pravděpodobnosti získání malých hodnot dále od nuly. Potřebovali by jste vytvořit miliardy Gaussových náhodných čísel se středem v 0, rozdílem 1 než by jste například uviděli vygenerovanou hodnotu 9. Můžete si přečíst více o normálním rozložení zde a zde.

Gaussův šum velmi tíhne koncentrovat kolem zadaného středu, a je tak více "přírodní" než uniformně rozšířený šum. Většina věcí v přírodě (včetně jarních srážek, kalorických příjmů, a samozřejmě šumu) se shlukuje kolem "normální" hodnoty, s postupně méně častými výskyty čím dále se dostáváte od normálu.

O přidání šumu pro eliminaci DCT bloků si můžete přečíst více na tomto vlákně Ars Technica (upraveno Wilbertem: Už nemůžu najít příslušné vlákno).

> `Blockbuster` (clip, method="noise", běžné parametry, float "mean", float "variance", int "cache", int "seed")

Parametr | Popis | Výchozí
--- | --- | ---
mean, variance | Střed a změna generovaného náhodného šumu. | mean = 0, variance = 1
cache | Protože generování Gaussových čísel je velmi pomalé, pro dosažení rozumného výkonu Blockbuster vytváří vyrovnávací paměť náhodných čísel při startu. Tento parametr zadává velikost vyrovnávací paměti v kilobajtech. I když můžete nastavit tuto hodnotu na jakékoli kladné číslo, je nejlepší ji držet docela velkou, aby se udržoval řádný náhodný šum. I když se může zdát výchozí hodnota dost velká, uvažte toto: Pokud máte velikost bloku 8, pak každý blok má oblast 64 pixelů. Každý pixel vyžadje 2 bajty pro svůj popis takže zpracovaný blok spotřebuje 128 bajtů náhodných dat. Pokud 10% bloků ve snímu 640x480 je zpracováno, bude to vyžadovat přibližně 62kb náhodných čísel. | 256
seed | Ve výchozím stavu pseudogenerátor náhodných čísel, použije systémový aktuální čas jako svou základní hodnotu. Pro určuté aplikace, kde jsou požadovány předpověditelné výsledky může být parametr seed použit pro přepsání této výchozí hodnoty, a tak poskytuje stejně "náhodný" šum v každém čase, kdy filtr běží. Seed může být jakékoli číslo od 0 do 2,147,483,647. Když je, použije se systémový aktuální čas. | 0

### method="dither"

Tato metoda je velmi podobná metodě "noise" , jen s tím rozdílem, že tato metoda přidá stejný šum do každého snímku klipu, kdežto metoda "noise" přidá jiný šum do každého snímku. Efekt tohoto se těžko popisuje, ale snadněji se vidí, takže zkuste si ho s vysokým parametrem variance. Nejbližší porovnání, které mě napadá je, že tato metoda vytváří efekt podobný sledování videa přes skvrnité sklo.

Důvod proč jsem přidal tuto metodu je, že jsem shledal při použití method = "noise" že konstantně měnící se povaha šumu vytvářela pohyb v jinak statických oblastech snímku, obzvlášť při použití nízkého datového toku. Je mou nadějí, že použití stejného šumu pro každý snímek zabrání artefaktovému pohybu ve statických oblastech. Mělo by to být považováno za experimentální.

> `Blockbuster` (clip, method="dither", běžné parametry, float "mean", float "variance", int "seed")

Na popis parametrů této metody, se podívejte na metodu "noise" výše. Nicméně si všimněte, že metoda "dither" nemá parametr cache protože generuje jen šum pro jeden snímek.

### method="sharpen"

Tato metoda aplikuje základní (a rychlý) zostřovací filtr na zpracovávané bloky. Takto "zesiluje" už přítomný detail v bloku raději než aby přidával nový šum.

> `Blockbuster` (clip, method="sharpen", běžné parametry, int "strength")

Parametr | Popis | Výchozí
--- | --- | ---
strength | Zadává sílu zostřování, od 1-100. | 25

### method="blur"

Tato metoda aplikuje rozmazání 3x3 na zpracovávané bloky. V současnosti je experimentální, protože teoreticky snižování frekvence už tak nízkofrekvenčních bloků nesníží vzhled DCT bloků. Ale stojí to za pokus :).

> `Blockbuster` (clip, method="blur", běžné parametry, int "strength")

Parametr | Popis | Výchozí
--- | --- | ---
strength | Zadává sílu rozmazání, od 1-100. | 25

### method="show"

Tato metoda zvýrazňuje bloky, které budou zpracovány použitím zadaných běžných parametrů bloků (block_size, detail_min, a detail_max). Je hlavně užitečná jako vizuální pomoc v nastavení prahových hodnot detailu na požadovaný rozsah.

Tato metoda nemá doplňkové parametry.

## Na dopracování

- MMX/SSE optimalizace (Napřed musím nastudovat x86 assembler...).
- Metoda unsharp mask.

## Autor

Ross Thomas <ross(at)grinfinity.com>

`$English Date: 2004/08/13 21:57:25 $`

`Český překlad:7.5.2009`