Magari a qualcuno può servire quindi la butto qua. In un paio di occasioni mi è servito di maskare dei credit, ma per vari motivi usando il mask proposto da chibi mi si andava ad aggiungere alla mask roba che non volevo. Questo non per colpa della mask chiaramente, ma magari perché stavo andando ad usare dbl a 720p su un qualcosa che 720p non era (senza che dbl facesse troppi danni), come mi è capitato di recente con una .ts di ZnT. Per evitare questo sono andato a modificare leggermente la funzione proposta da chibi aggiungendo un'ulteriore modalità, la quale va a creare la mask su un principio completamente diverso dal fare la differenza tra la clip di partenza e la clip downscalata con dbl e riupscalata con bilinear. Per la precisione questa modalità sfrutta il fatto che, solitamente, i credit sono aggiunti in pc-range, mentre tutto il resto DOVREBBE essere in tv-range. Quindi, andando a fare la mask su tutto quello che ha il luma in pc-range, si dovrebbe ottenere qualcosa di più o meno accurato. Veramente, l'ho modificata al volo e usata un paio di volte a dir tanto, quindi se notate qualcosa che non va fatemi sapere. Più che altro vuole essere uno spunto. CODICE function MaskDetailMod(clip clp, int final_width, int final_height, int "RGmode", int "cutoff", float "gain", int "expandN", int "inflateN", bool "blur_more", float "src_left", float "src_top", float "src_width", float "src_height", int "Mode", int "thr") { Mode = default( Mode, 1 ) # =1 -> mt_makediff !=1 -> PC-Range Mask thr = default( thr, 233 ) RGmode = default( RGmode, 3) # spatial filter to remove false positive (noise, compression artifact and so on) , this is its mode cutoff = default( cutoff, 70 ) # exclude from the mask the pixel with less than this value gain = default( gain, 0.75 ) # increase the value of the remaining pixel expandN = default( expandN, Mode==1 ? 2 : 4 ) # how many mt_expand inflateN = default( inflateN, Mode==1 ? 2 : 4 ) #how many mt_inflate blur_more = default( blur_more, false ) #additional blur after resize src_left= default( src_left, 0 ) src_top = default( src_top, 0 ) src_width = default( src_width, 0 ) src_height = default( src_height, 0 ) CUT = string(cutoff) GAN = string(gain) TH = string(thr)
initial_mask= Mode==1 ? \ mt_makediff(clp,clp.debilinearY(final_width,final_height).bilinearresize(clp.width(),clp.height()),u=1,v=1).Removegrain(RGmode,-1) : \ mt_lut(clp, "x "+TH+" > x 0 ?",u=1,v=1).Removegrain(RGmode,-1)
mask = initial_mask.histogram("luma").mt_lut("x "+CUT+" < 0 x "+GAN+" 256 x + 256 / * * ?",u=1,v=1) expanded = mask.expandMask(expandN) inflated = expanded.inflateMask(inflateN) final = blur_more ? inflated.BilinearResize(final_width, final_height, src_left, src_top, src_width, src_height).Removegrain(12,-1) : inflated.BilinearResize(final_width, final_height, src_left, src_top, src_width, src_height) return final.Greyscale() }
function expandMask(clip clp, int "expandN") { return expandN > 0 ? expandMask(clp.mt_expand(u=1,v=1), expandN - 1) : clp }
function inflateMask(clip clp, int "inflateN") { return inflateN > 0 ? inflateMask(clp.mt_inflate(u=1,v=1), inflateN - 1) : clp } È uguale a quella nel primo post, semplicemente ho aggiunto mode e thr. Mettendo Mode a 2 (o qualunque cosa diversa da 1 che è il valore di default) si va a creare la mask considerando il pc-range. Invece thr determina il valore di soglia oltre il quale si va a maskare. In teoria thr dovrebbe essere 235, ma ho notato che spesso conviene metterla un poco più bassa per prendere meglio quello che ci interessa, tanto se viene preso qualcos'altro spesso questo viene filtrato da degrain e lut successivi. Quindi di default l'ho messa a 233, ma se si vuole si può modificare mentre si fa un riscontro visivo su quello che stiamo maskando. Inoltre ho notato che maskando sulla base del pc-range spesso conviene dare qualche ciclo in più di inflateMask e expandMask, visto che con 2 cicli solitamente ci si perde qualcosa. Di conseguenza, se si utilizza un Mode != 1, i cicli di inflateMask e expandMask di default saranno 4 invece che 2.
|