4.2 Postprocessing il video; usando AviSynth

Ci sono diversi vantaggi nell'usare AviSynth al posto di Virtualdub:

Noi dovremmo usare VirtualdubMod invece di VirtualDub perché

  1. VirtualdubMod può processare YV12 (necessario se uso AviSynth v2.5)
  2. VirtualdubMod ha uno script editor (necessario quando sto facendo correzioni di colore)

Maggior informazioni su AviSynth e i suoi filtri le puoi trovare qui

Determinare i tagli in VirtualdubMod:
Spesso si vogliono eliminare delle parti dal video catturato (per esempio tagliare la pubblicità). Un modo facile per farlo è creare uno file avs (chiamato anche script), per caricare il tuo file avi catturato:

AviSource("d:\capture.avi")

o se hai più segmenti:

SegmentedAVISource("d:\capture.avi")

dove il nomi dei files sono assegnati con d:\capture.00.avi, d:\capture.01.avi e così via fino a d:\capture.99.avi. Apri il file avs in VirtualdubMod e taglia le parti dal tuo clip (seleziona l'intervallo, e poi premi del). Apri lo Script editor (sotto il menu Tools), e dal menu edit seleziona "Import Frameset as Trims". Il tuo script dovrebbe avere un aspetto tipo questo (se le linee sono scambiate, rimettile a posto).

AviSource("c:\lopez-Jenny_from_the_bronx.avi")
Trim(0,3) ++ Trim(8,31) ++ Trim(43,101)

Puoi anche usare una utility chiamata vcf2avs. Questa converte il file dei processi (vcf) in un file avs includendo i tagli. Per maggior informazioni vedi AviSynth Q&A o vcf2avs by Dark$oul71 (discussion and download) e vcf2avs by bb (discussion and download). Non sono lo stesso programma. Lo hanno sviluppato nello stesso momento e perciò portano lo stesso nome!
Se lo stai facendo manualmente, ricordati che VirtualdubMod inizia a contare i frame da 1, mentre AviSynth inizia da zero. Per esempio: Supponiamo di voler tenere i fotogrammi 1-2000, il tuo script sarà:

AviSource("d:\capture.avi")
Trim(0, 1999)

o se vuoi eliminare qualcosa in mezzo (per esempio vuoi eliminare i fotogrammi da 100-200)::

clip=AviSource("d:\capture.avi")
Trim(clip, 0, 99)+Trim(clip, 201, 1999)

o se hai catturato a segmenti:

SegmentedAVISource("d:\capture.avi")
Trim(0, 1999)

Rimuovere l'effetto arcobaleno e punto strisciato:
Il tuo clip può avere l'effetto arcobaleno o punto strisciato. Gli arcobaleno sono causati da una imperfezione nella separazione delle componenti luma e croma del segnale video composito. E' più evidente sulle immagini generate a computer come nei sottotitoli, weather maps, e nei loghi statici. Ogni volta che hai un bordo (= alte frequenze) di luma, hai un arcobaleno, omogeneo leggero. Ogni volta che hai una grande variazione di croma (tipicamente nei loghi), hai un punto strisciato. Per i dettagli, dai uno sguardo a rimuovere l'effetto arcobaleno e punto strisciato.

Deinterlacciamento:
Quando catturi dalla televisione devi decidere se deinterlacciare o meno. Dovresti dare uno sguardo alle seguenti considerazioni:

Nel caso in cui hai scelto di non deinterlacciare, leggi la sezione opzionale: "processing interlaced video". Qui abbiamo assunto che il video deve essere necessariamente deinterlacciato:

Dovresti farlo prima di qualsiasi smoothing, cropping o resizing. Prima devi determinare a quale genere di interlacciamento è soggetto il tuo sorgente. Nota questo è differente per ogni broadcaster (giornale radio), e qualche volta broadcasting (radiotelevisione). Questo implica che devi fare questa procedura ogni volta che catturi qualcosa. Ci sono diversi casi:

PAL:
1) phase shifts (fase traslata e/o campi in ordine invertito (= campi scambiati) [per maggior informazioni, leggi il readme del plugin Decomb]
2) realmente interlacciata
3) pessima conversione da NTSC a PAL

Può capitare che il deinterlacciamento che vuoi usare non lavori nello spazio di colore della tua cattura. Decomb per esempio richiede YUY2 o YV12. Se hai problemi, dovresti convertire il formato colore sui campi invece del clip stesso, per esempio:

AviSource("d:\capture.avi")  # ipotizziamo che la sorgente sia RGB
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()

Per decidere quale caso trattare, adatta il file tuo avs, in modo che i campi possono essere visti separatamente:

AviSource("d:\capture.avi")  # ipotizziamo che la sorgente sia YUY2
Trim(begin, end)
SeparateFields()

e aprilo in VirtualdubMod. Click con il tasto destra sul clip di sinistra (sorgente) e seleziona "2x size" per ingrandirlo, e muovi il cursore della barra di scorrimento fotogramma per fotogramma (in un piccolo intervallo di fotogrammi, diciamo 20). Se a malapena vedi qualche linea orizzontale in entrambi i campi, significa che siamo nel caso 1. Se vedi ancora linee orizzontali siamo nel caso 2. Se vedi fotogrammi blended (anche chiamato effetto ghost) significa che siamo nel caso 3.

1) Nel primo caso il seguente script tiene contro dell'effetto interlacciamento (usando il plugin Decomb):

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

o se alcuni fotogrammi sono realmente interlacciati:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace(full=false)

Ma puoi anche provare deinterlacciamenti simili, come GreedyHMA o TomsMoComp. Se non sei soddisfatto della qualità ottenuta (e stai usando AviSynth v2.5x) potresti considerare un deinterlacciamento più lento come "Area based deinterlacer". Nota che questo deinterlacciamento richiede lo spazio colore RGB32.

3) In questo caso hai avuto sfortuna. E' meglio lamentarsi con la tua stazione televisiva :) Se i campi blended sono principalmente presenti in uno o due campi, puoi buttare via un campo e "ridurre" l'altro campo usando il seguente script:

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
SelectEven()  # o SelectOdd() se vuoi i fotogrammi dispari
HorizontalReduceBy2()

Perderai informazioni, ma è meglio della presenza di campi blended. Nota che il tuo clip è scalato (verticalmente e orizzontalmente) di un fattore di due. Infine, se i campi blended sono presenti in entrambi i campi, tu sei proprio sfortunato. Non c'è nessun metodo soddisfacente per trattare questo genere di materiale. Puoi fare essenzialmente tre scelte:

a) Non deinterlacciare, vedi "processing video interlacciato".

b) Trattare i tuoi clip come totalmente interlacciati e usare il seguente script:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

c) Usare a Bob:

Bob()
SelectEven()

o per una migliore qualità, un Bob intelligente (usando il plugin SmoothDeinterlace per esempio):

 # SmoothBob usa Smoothdeinterlace per bob il video.
 # Parameter Topfirst = 1 (default) userà il top field come first field
 #                                 0 userà il bottom field come first field

function SmoothBob(clip clip, int "Topfirst")
{
  t = default(Topfirst, 1)
  top = (t==1) ? true : false
  clip.SmoothDeinterlace(tff=true, doublerate=true)
}

 # SmoothDeinterlace richiede YUY2:
SeparateFields()
ConvertToYUY2()
Weave()
SmoothBob()
SelectEven()

NTSC:
1) materiale in telecine (29.97 fps)
2) phase shifts (fase traslata) e/o fields swapped (campi scambiati) (23.976 fps)
3) realmente interlacciato (29.97 fps)

Può capitare che il deinterlacciamento che vuoi usare non lavori nello spazio di colore della tua cattura. Decomb per esempio richiede YUY2 o YV12. Se hai questo problema dovresti convertire il formato colore dei campi invece del clip stesso, per esempio:

AviSource("d:\capture.avi")  # ipotizziamo una sorgente RGB
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()

1) Primo controlla se il clip è in telecine. Apri il file avs in VirtualdubMod:

AviSource("d:\capture.avi")  # ipotizziamo una sorgente YUY2
Trim(begin, end)

Se in ogni cinque fotogrammi vedi tre fotogrammi progressivi e due interlacciati allora hai un clip in telecine. In questo caso la gente applica l'inversione del telecine, InVerse TeleCine (IVTC):

AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
Decimate(cycle=5)

Per gli altri due casi, adatta il tuo file avs per vedere i campi separati:

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()

e aprilo in VirtualdubMod. Clicca con il tasto destro sulla clip di sinistra (sorgente) e seleziona "2x size" per ingrandirlo. Scorri il cursore della barra scorrevole lentamente (in un piccolo intervallo di fotogrammi, diciamo 20). Se vedi a malapena qualche linea orizzontale in entrambi i campi, allora significa che siamo nel caso 2. Se vedi linee orizzontali siamo nel caso 3.

2) Nel primo caso il seguente script tiene conto dell'effetto di interlacciamento (usando il plugin Decomb):

AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()

3) Nel terzo caso puoi provare il seguente script (usando il plugin Decomb):

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace()

o se alcuni fotogrammi sono veramente interlacciati:

AviSource("d:\capture.avi")
Trim(begin, end)
FieldDeinterlace(full=false)

Ma puoi anche provare deinterlacciamento simili come GreedyHMA o TomsMoComp. Se non sei soddisfatto per la qualità ottenuta (e stai usando AviSynth v2.5x) potresti considerare un deinterlacciamento più lento "Area based deinterlacer". Nota questo deinterlacciamento richiede RGB32.

Nello script di deinterlacciamento sopra si è assunto che il clip originale è in YUY2 (o YV12), perché Decomb richiede YUY2 (o YV12). Se il tuo clip è in RGB dovresti modificare il tuo script, per esempio come questo:

AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
ConvertToYUY2()
Weave()
Telecide()

Riferimenti:
IVTC tutorial: Maggiori informazioni su IVTC e deinterlacciamento.
Decomb, GreedyHMA and other deinterlacers: Qui puoi trovare plugins per AviSynth v2.0x e v2.5x

Correzione della traslazione del croma (Chroma Shifts):
Qualche volta la cattura di una vhs registrata può avere il croma traslato (anche chiamato color bleeding). Questo significa che uno o più colori sono traslati in direzione. E' possibile correggerli usando il plugin ChromaShift. Per dettagli, devi guardare la sezione Correzione dello spostamento del!

Rimozione del Logo:
Non aspettarti miracoli! Se il logo è molto piccolo, è possibile ottenere risultati ragionevoli. Personalmente, non rimuovo mai nessun logo, perché noterei sempre che ce n'era uno. Per sicurezza, non lo consiglio alle persone che sono nuove nello scenario della cattura. Per dettagli guarda la sezione  Filtri per eliminare il logo!

Rimuovere la spazzatura nella parte inferiore (e superiore) del clip:
Di solito vedrai una decina di linee di spazzatura nella parte inferiore del tuo clip catturato (qualche volta le vedrai anche nella parte superiore). (Guarda qui per una spiegazione.) Questo è brutto da vedere, e noi dovremmo rimuoverle per sostituirle con linee nere. Così lo script diventerà per esempio (presupponiamo il sistema PAL):

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)  # Puoi anche mascherare la parte sinistra e destra. Crop e AddBorders li puoi anche usare (ma sono leggermente più lenti).

Nota questo, il taglio di linee di un clip in YUY2 (e anche di uno in YV12) deve essere pari.

Smoothing:
Ci sono principalmente due ragioni perché dovresti fare lo smooth di un clip:

a) Le catture analogiche (come opposto del digitale che sono spesso pulite) contengono rumore. La natura di questi rumori è principalmente dovuta ai cavi che portano il segnale in casa tua.
b) Per rendere il tuo clip finale più compressibile. Questo è molto importante se il tuo obiettivo è il SVCD (o VCD), perché il DivX/XviD comprime meglio di un SVCD/VCD.

La principale difficoltà è trovare un buon compromesso tra rumore/compressibilità, il livello di dettaglio che vuoi ottenere dal tuo clip e il tempo di codifica. E' meglio fare lo smooth prima del ridimensionamento, perché rimuoverà più rumore in questo modo, consiglio di usare un filtro smoother di tipo spaziale-temporale, o spaziale e poi temporale.

Questo modo permetterà di rimuovere più rumore di quanto se ne tolga utilizzando il solo metodo spaziale. Ma ricorda se usi uno smoother temporale con valori troppo forti, vedrai un effetto blending tra i fotogrammi. Così, usa valori bassi quando utilizzi i temporal smoothers.

E' consigliabile usarlo prima del ridimensionamento. Se hai alte risoluzioni, il filtro lavora con maggiori dati, il che implica che il rumore può essere facilmente trovato. Ridimensionare ad una risoluzione più piccola, minore risoluzione, il ridimensionamento di solito nasconde anche alcuni rumori. Così finirai per avere uno scenario migliore. La conseguenza e lo svantaggio è che richiede molto tempo rispetto allo smooth applicato dopo il ridimensionamento.

Se dai uno sguardo ai forums e script postati, vedrai che qualche volta le persone usano tonnellate di smoothers nei loro script. Questo non è necessario e costa solo molto tempo di codifica. Ricordati che se usi solo uno smoother il tuo tempo di codifica diminuirà drasticamente.

Quale smoothers dovresti usare? Sostanzialmente è una questione di gusto, dipende dal formato colore che è richiesto e dal tempo di codifica quando lo usi. Alcuni esempi di smoothers spaziale-temporale:

Se vuoi usare plugins AviSynth v1.0x/v2.0x in AviSynth v2.5x, qui c'è descritto un modo su come farlo. Nota questi plugins richiedono lo spazio colore YUY2. Nota che AviSynth v2.5x ha la caratteristica di caricare in automatico i plugins, così non sarà necessario caricare questi plugins esplicitamente.

 # LoadPlugin("c:\LoadPluginEx.dll")
 # LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
 # LoadPlugin("c:\AviSynth2\plugins\peachsmoother.dll")
 # LoadPlugin("c:\AviSynth2\plugins\nomosmooth.dll")

 # AviSynth v1.0x/v2.0x plugins:
 # PixieDust(5)  # molto lento, ma comprime (e rimuove il rumore) bene, mentre preserva molto dettaglio.
 # PeachSmoother()  # le persone riportano che questo plugin contiene un bug (risultato blended frames, visibile in tutti i settaggi)
 # NoMoSmooth()
 # Convolution3d(preset="vhsBQ")
 # FluxSmooth(7, 7)
 # STMedianFilter(8, 15, 4, 7)

 # AviSynth v2.5x plugins:
 # Convolution3d(preset="vhsBQ")
 # FluxSmooth(7, 7)
 # STMedianFilter(8, 15, 4, 7)
 # deen("c3d", 0, 10, 12, 3)

Ho usato le configurazioni standard qui, puoi giocarci sopra se non sei soddisfatto. Personalmente a me piace PixieDust (per i piccoli clips come i videoclips), così lo script diventa per esempio:

 # using AviSynth v2.5x (clip is YUY2):
LoadPlugin("c:\!LoadPluginEx.dll")  # stai attento a non mettere questo plugin nella cartella dei tuoi plugin.
LoadPlugin("c:\!AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)

 # using AviSynth v2.0x (clip is YUY2):
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)

Quando catturi clips lunghi, dovresti usare il Convolution3d per esempio.

Se vuoi usare uno smoother spaziale e temporale separatamente, puoi usare per esempio "Chroma Noise Reducer (CNR2)" e poi TemporalCleaner. Lo script diventa:

 # using AviSynth v2.5x (clip is YUY2):
LoadPlugin("c:\LoadPluginEx.dll")  # stai attento a non mettere questo plugin nella cartella dei tuoi plugin.
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
ConvertToYV12()  # TemporalCleaner richiede YV12
Cnr2()
TemporalCleaner()

Riferimenti:
Smoothers: Qui puoi trovare i plugins per AviSynth v2.0x e v2.5x.

Resizing:
 

Dopo il deinterlacciamento, il ritaglio e lo smoothing, il clip deve essere ridimensionato. Stai attento quando usi per esempio FitCD per calcolare la tua nuova risoluzione. Il problema è che alcune schede (le ATI, o quelle con il Chipset BT 8x8) eseguono uno ridimensionamento interno, invece di aggiungere i bordi neri (i drivers per le Asus/NVidia lo fanno correttamente). Prima devi vedere in quale delle due situazioni ti trovi (leggi la prefazione). Certamente, la nuova risoluzione dipende dall'encoding (XviD o SVCD) e dal bitrate di codifica. Per scovare la corretta configurazione di ridimensionamento, dei dare uno sguardo alla prefazione: PAL o NTSC:

ridimensionamento per PAL:
704x576 con un PAR di 128/117 e 2 pixel overscan (bordi neri)
720x576 con un PAR di 128/117 e 18 pixel overscan
720x576 senza overscan -> non conforme con lo standard ITU -> usare un generico PAR (48/45)
768x576 con un PAR di 1/1 senza overscan

Questo implica le seguenti due situazioni:
[1]: cattura a 704x576, 768x576 o 720x576 senza overscan.
[2]: cattura a 720x576 con 18 pixels di overscan (non ITU conforme).

La cosa più importante è quella di capire se scoprendo il cappello, il risultato è un 720x576 (o 720x480 per NTSC) in overscan [1], o no [2]. Il resizing/cropping è differente per questi casi. Questo può essere controllato con una utility chiamata FitCD.

 # PAL [1], XviD:
BicubicResize(640, 480)  # o scalando di questa dimensione 

 # PAL [2], XviD:
Crop(8, 0, 704, 576)
BicubicResize(640, 480)  # o scalando di questa dimensione 

 # PAL [1], SVCD
BicubicResize(480, 576)

 # PAL [2], SVCD
Crop(8, 0, 704, 570)
BicubicResize(448, 544)
AddBorders(16, 16, 16, 16)  # aggiungere overscan per il tuo SVCD

ridimensionamento per NTSC:
704x480 con PAR di 72/79 e 7 pixels cropped orizzontalmente
720x480 con un PAR di 72/79 e 9 pixels di overscan
720x480 con un generico PAR di 9/10 e senza overscan
640x480 con un PAR di 1/1 e senza overscan
640x480 con un generico PAR di 81/80 e scalato orizzontalmente (non sono sicuro che questo accade)

Questo implica le seguenti tre situazioni:
[1]: cattura a 704x480, 640x480 o 720x480 (tutte e tre ITU conforme).
[2]: cattura a 720x480 con overscan (non ITU conforme).
[3]: cattura a 704x480 (non ITU conforme).

Raccomando di non catturare a 640x480, è molto difficile individuare in quale delle due situazione capita.

 # NTSC [1], XviD:
BicubicResize(640, 480)  # o scalando di questa dimensione

 # NTSC [2], XviD:
Crop(8, 0, 712, 480)
AddBorders(0, 6, 0, 0)
BicubicResize(640, 480)  # o scalando di questa dimensione 

 # NTSC [3], XviD:
AddBorders(0, 6, 0, 0)
BicubicResize(640, 480)  # o scalando di questa dimensione 

 # NTSC [1], SVCD
BicubicResize(480, 480)

 # NTSC [2], SVCD
Crop(8, 0, 712, 480)
AddBorders(0, 6, 0, 0)
BicubicResize(448, 448)
AddBorders(16, 16, 16, 16)  # aggiungere overscan per il tuo SVCD

 # NTSC [3], SVCD
AddBorders(0, 6, 0, 0)
BicubicResize(448, 448)
AddBorders(16, 16, 16, 16)  # aggiungere overscan per il tuo SVCD

Lo script diventa per esempio (assumiamo PAL [1] e il target a XviD):

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)
BicubicResize(640, 480)

Riferimenti:
Square and non-square pixels: Tutto sui pixels quadrati e non-quadrati.
Resolutions, Aspect Ratios And The ITU-R BT.601 Standard: Introduzione generale sulla Risoluzione, Aspect Ratios e lo Standard ITU-R BT.601 Standard.
FitCD: Una utility per calcolare come dovresti resize/crop le varie sorgenti.
Der Karl's Apect Ratio for Dummies: Il nome dice tutto, ma è solo per il sistema PAL.
A Quick Guide to Digital Video Resolution and Aspect Ratio Conversions: Il nome dice tutto

Regolazione dei Colori (con AviSynth v2.5):
Se con la tua cattura, vedrai che i colori sono leggermente distorti, i colori lucidi sono più lucidi e i colori scuri sono più scuri, la ragione è la seguente: Normalmente i valori nello spazio colore YUV non sono mappati da 0 a 255 (intervallo per il PC), ma hanno un intervallo limitato, (intervallo per la TV). Questo intervallo è limitato a 16-236 per la componente luma e 16-240 per la componente croma di un segnale in YUV. Il problema è che molti dispositivi di cattura lo scalano a 0-255, e questo deve essere scalato di nuovo a 16-236. Scorri attraverso i clip e vedi se i tuoi colori sono in effetti distorti. Se lo sono, puoi correggerli usando il filtro interno ColorYUV (per AviSynth v2.08 c'è un plugin disponibile, ColorYUV):

ColorYUV(levels="PC->TV")

Scorri di nuovo attraverso i clip, per vedere se la distorsione è stata corretta. Se non lo è, rimuovi la linea e correggila manualmente. Devi cercare la configurazione una solo volta. Per la prossima cattura puoi usare gli stessi valori, a condizione che non li cambi nella configurazione di cattura. Per la Btw, non conosco come farlo con AviSynth v2.08, l' Histogram è disponibile solo nella versione AviSynth v2.5.

Noi useremo l'istogramma per tarare il brightness (luminosità) e il contrast (contrasto). L'istogramma richiede lo spazio colore YV12, quindi aggiungiamo le seguenti linee allo script:

ColorYUV(off_y=0, gain_y=0)
ConvertToYV12()
Histogram()

Apri lo script in VirtualdubMod. Click con il tasto destro sul clip e seleziona normal per allargare il clip. Vedrai il clip con l'istogramma. Sull'asse delle ascisse è rappresentata la luminosità. Se la guardi attentamente vedrai che l'intervallo 0-15 è marrone (significa non valido), l'intervallo 16-236 è nero (valido) e 237-255 è marrone (non valido). L'istogramma stesso può essere bianco (se si trova nell'intervallo valido 16-236) o giallo (se si trova nell'intervallo non valido).

Guarda sopra la parte di fotogramma che è nera (bordi neri per esempio, questo fotogramma per esempio). Se l'istogramma è giallo in questa parte, significa che dobbiamo incrementare la luminosità (es: brightness) fino a che l'istogramma non diventa bianco. Se è bianco dobbiamo diminuire la luminosità fino a che non diventa giallo. Apri lo script editor (sotto a tools), modifica il valore di off_y e premi F5 per il preview. Lo script diventerà per esempio:

ColorYUV(off_y=-20, gain_y=0)
ConvertToYV12()
Histogram()

Guarda la parte di fotogramma che è molto luminosa (il fotogramma sopra per esempio). Incrementa (o decrementa se necessario) il valore di gain_y per estendere la luminosità fino a che non la puoi ulteriormente aumentare. Lo script diventerà per esempio:

ColorYUV(off_y=-20, gain_y=64)
ConvertToYV12()
Histogram()

Vedrai che anche il limite di sinistra è stato spostato (perché era sopra i 16 invece di 0, e cambiando gain_y, significa moltiplicare). Vai indietro al fotogramma originale, e regolalo di nuovo. Lo script diventerà per esempio:

ColorYUV(off_y=-28, gain_y=64)
ConvertToYV12()
Histogram()

Continua fino a che sei soddisfatto. Se lo sei, è tempo di regolare la saturazione (es: colorness/chrominance). Le ozpioni "cont_u" e "cont_v" dipendono dalla saturazione nel seguente modo:

cont_u = cont_v = - (1 - saturation) * 256

Esempio: saturation = 0.8 implica cont_u = cont_v = - 0.2 * 256 = - 51.2. Guarda su il fotogramma che contiene qualcosa di molto rosso o blue (per esempio i vestiti), o guarda proprio la pelle delle persone, e incrementa/decrementa la saturazione. Lo script diventerà per esempio:

saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu)

Assicurati che la luminance (luminosità) e la chrominance (crominanza) stia in un intervallo valido, configura opt="coring" con option in ColorYUV. Rimuovi l'istogramma, non ne abbiamo più bisogno:

saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu, opt="coring")

Fade in e out:
E' sempre carino sfumare in ingresso e uscita il tuo clip, ma certamente non necessario. Se lo vuoi fare, puoi usare il filtro FadeIO2. Il tuo script diventerà per esempio:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
Telecide()
LetterBox(0, 16)
PixieDust(5)
BicubicResize(640, 480)
saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu, opt="coring")
FadeIO2(13)

4.2.1 Processing il video interlacciato:
Se vuoi elaborare un video interlacciato (così lascialo interlacciato), dovresti ricordare due cose. Quando stai usando solo il filtro spatial smoother, è sufficiente usare:

SeparateFields()
Filter(...)
Weave()

Ma quando stai usando uno spatio-temporal smoother (o giusto un temporal smoother), questo produce un risultato sbagliato. La ragione di questo è che il temporal smoothing agisce su due campi dello stesso fotogramma (questo accade per metà del numero dei fotogrammi). Per evitare questo, dovresti metterli in clips diversi:

SeparateFields()
even = SelectEven(last).Filter(...)
odd = SelectOdd(last).Filter(...)
Interleave(even, odd)
Weave()

Lo script sopra diventa per uno spatial smoother:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
LetterBox(0, 16)
SpaceDust(5)  # spatial smoother
BicubicResize(640, 240)  # nota che l'altezza è divisa per due, stiamo ridimensionando campi invece di fotogrammi
ColorYUV(levels="PC->TV")
FadeIO2(13)
Weave()

e per lo spatio-temporal smoother:

LoadPlugin("c:\LoadPluginEx.dll")
LoadPlugin("c:\AviSynth2\plugins\dustv5.dll")
AviSource("d:\capture.avi")
Trim(begin, end)
SeparateFields()
LetterBox(0, 16)
even = SelectEven(last).Convolution3d(0, 10, 17, 10, 13, 2.8, 0) # spatio-temporal smoother
odd = SelectOdd(last).Convolution3d(0, 10, 17, 10, 13, 2.8, 0) # spatio-temporal smoother
Interleave(even, odd)
BicubicResize(640, 240)  # nota che l'altezza è divisa per due, stiamo ridimensionando campi invece di fotogrammi
weave()
ColorYUV(levels="PC->TV")
FadeIO2(13)
Weave()

4.2.2 Usando la cattura multipla per ridurre il rumore:
Il rumore nella cattura è dovuto principalmente dal cavo che porta il segnale televisivo. Questo implica che il rumore sarà casuale, paragonandolo a un differente broadcasting (o allo stesso clip). Usando AviSynth è possibile mediare multipli broadcastings (di uno stesso clip) usando il filtro Layer. L'idea è di deinterlacciare prima di mediare i clips, e di usare un leggero denoiser dopo. Prima devi determinare se ci sono fotogrammi presenti nel primo sorgente che mancano nel secondo (e gli altri intorno). Guarda su quali fotogrammi ci sono (con l'apertura di entrambi le catture allo stesso tempo, guardando il primo fotogramma comune e saltando attraverso i clips diciamo di 1000 fotogrammi). Il tuo script diventerà per esempio:

clip1 = AviSource("f:\atomic_kitten-the_tide_is_high.avi").Trim(248,5389).Telecide()
clip2 = AviSource("f:\atomic_kitten-the_tide_is_high2.avi").Trim(129,5271).DeleteFrame(501).Telecide()
Layer(clip1, clip2, "fast")
LetterBox(0, 16)
ConvertToYV12()  # se necessario, Convolution3d richiede YV12
Convolution3d(preset="movieLQ")
BicubicResize(640, 480)
saturation = 0.8
cu = - (1-saturation)*256
ColorYUV(off_y=-28, gain_y=64, cont_u=cu, cont_v = cu, opt="coring")
FadeIO2(13)

Riferimenti:
Averaging two analog captures for noise reduction: Una grande discussione sulla media delle catture analogiche per la riduzione del rumore è su Doom9.


Prossimo passo: compressione video e audio: <NEXT>

RITORNA all'Indice: <HOME>


Last edited on: 09/22/2003 | First release: n/a | Author: Wilbert | Content by Doom9.org

Guida tradotta da *django* il 01/10/03