Newsgroup: it.comp.software.divx
Titolo: Algoritmi di deinterlacciamento

ciao a tutti
ho iniziato a interessarmi agli algoritmi di deinterlacciamento
e vorrei capire:
1) quali sono i piu' usati, sia commerciali che non?
2) quali sono le differenze?
voi con quale vi trovate meglio?!
io inizialmente (piu' di un anno fa) usavo il cosiddetto "linear
blend" (lb) (avevo letto una guida che lo consigliava), poi, a un
certo punto mi accorsi che alcuni risultati erano troppo "confusi"
(mi veniva il mal di testa a guardarli) e passai a usarne altri
due (quelli che in mencoder si chiamano "lavc deinterlacer" e
ffmpeg deinterlacer"), e con questi mi sono trovato meglio...
recentemente ho visto che in mplayer/mencoder ne e' stato aggiunto
un altro: "FIR lowpass 5 deinterlacer", e a questo punto vorrei
cercare di capire quale mi conviene usare...
allora ho cominciato a guardare (e incorporare nei miei programmi)
gli algoritmi presenti in mplayer; questi si dividono in due gruppi:
- quelli compresi nella libreria libpostproc (e' una "sotto-libreria"
  di libavcodec, di cui va chiesta esplicitamente la compilazione,
  quando si compila il pacchetto "ffmpeg")
- altri due filtri esterni: lavc (sempre incluso in libavcodec, ma
  al di fuori di "libpostproc"); e "kernel deinterlacer" (si trova
  nel file "libmpcodecs/vf_kerndeint.c" di mplayer e viene descritto
  come il porting di un filtro Avisynth)
i filtri di deinterlacciamento presenti in libpostproc sono i
seguenti:
linear blend (lb)
linear interpolating (li)
cubic interpolating (ci)
median deinterlacer (md)
ffmpeg deinterlacer (fd)
FIR lowpass deinterlacer (l5)
nel codice sorgente c'e' una breve descrizione della strategia
di interpolazione di tali filtri, ma non c'e' nessun altro
commento sulla loro bonta' o su quando convenga usarne uno
piuttosto che un altro...
ho preso un DVD-movie con un film interlacciato (e' raro), ho
scelto un fotogramma dove si vedano gli effetti
dell'interlacciamento, e le ho applicato tutti questi algoritmi;
i risultati li ho messi qui (nota: per ridurre le dimensioni
ho dovuto salvare le immagini in jpeg a qualita' 75, e questo
ha alterato un po' i risultati, comunque gli effetti degli
algoritmi si vedono ancora bene...):
questo e' il fotogramma originale:
http://fsinapsi.altervista.org/tmp/originale.jpg
e queste sono le immagini deinterlacciate:
http://fsinapsi.altervista.org/tmp/lb.jpg
http://fsinapsi.altervista.org/tmp/li.jpg
http://fsinapsi.altervista.org/tmp/ci.jpg
http://fsinapsi.altervista.org/tmp/md.jpg
http://fsinapsi.altervista.org/tmp/fd.jpg
http://fsinapsi.altervista.org/tmp/l5.jpg
http://fsinapsi.altervista.org/tmp/lavc.jpg
a me sembra che il "lowpass 5" dia sempre risultati molto
simili al "linear blend", tuttavia un po' meno sfocati (va
notato che la dimensione della jpeg di l5 e' piu' alta
di quella di lb)
in genere, lavc e fd danno risultati simili, ma in questo
specifico caso e' molto meglio lavc!
del resto lavc e' molto simile a li (a occhio), e questo
viene confermato anche dal SSIM:
$ ssim-index lavc.ppm li.ppm 
matrice usata: uniforme 8x8
indice ssim = 0.991481
$ ssim-index lavc.ppm fd.ppm 
matrice usata: uniforme 8x8
indice ssim = 0.986071
$ ssim-index lavc.ppm l5.ppm 
matrice usata: uniforme 8x8
indice ssim = 0.959166
$ ssim-index lavc.ppm md.ppm 
matrice usata: uniforme 8x8
indice ssim = 0.985295
come si vede, lavc e' molto simile a li, piu' di quanto lo
sia con fd, e molto piu' di quanto lo sia con l5
per ora e' tutto.
se conoscete altri algoritmi (specialmente opensource), fatemi
sapere

 specifico caso e' molto meglio lavc!
riguardando i risultati, a occhio mi sembra che in questo specifico
fotogramma, il migliore sia "ci" (cubic interpolation): i contorni
della pelliccia sono piu' precisi...
in realta' non e' proprio cosi': "ci" e' quello che perde piu'
informazioni del secondo semiquadro...
ho fatto una seconda prova molto semplice: l'idea e' di applicare
gli algoritmi a fotogrammi progressivi: un algoritmo perfetto (utopia)
non dovrebbe apportare la minima modifica! naturalmente le cose non
stanno cosi' (ecco perche' bisogna evitare di deinterlacciare quando
i frame risultano progressivi, pur essendo acquisiti da tv...).
ho scelto un fotogramma progressivo abbastanza dettagliato, eccolo:
http://fsinapsi.altervista.org/tmp/casa.jpg
poi ho applicato i vari algoritmi e ho calcolato l'indice SSIM tra
i risultati e l'originale; nel caso ideale, il risultato dovrebbe
essere 1 (fotogramma inalterato), invece ecco i risultati:
md   -> 0.991950
l5   -> 0.990903
lavc -> 0.985747
lb   -> 0.981197
fd   -> 0.973520
li   -> 0.967577
ci   -> 0.967470
l'indice corrisponde a una specie di "soglia di discontinuita'":
piu' e' alto, piu' la discontinuita' tra righe adiacenti deve
essere alta affinche' l'algoritmo decida di intervenire; purtroppo
non si puo' ancora pretendere che un programma riconosca (in tempi
brevissimi) tutte e sole le discontinuita' dovute a
interlacciamento (differenza temporale tra i due semiquadri), quindi:
con una soglia troppo alta potrebbero restare alcune seghettature,
con una troppo bassa viene buttata via informazione che poteva
rendere l'immagine piu' dettagliata...
in questo specifico caso, l5 si e' comportato molto bene, e anche
md che si era comportato bene anche nell'altro...
la mia impressione e' che l5 sia una specie di "versione migliorata"
di lb, in quanto produce risultati simili ma meno sfocati...