module inscription newsletter haut de page forum mobile

Rejeter la notice

Nouvelle Formation Prise de son : les inscriptions sont ouvertes !
Maîtrisez la qualité de vos prises de son avec notre formation théorique et pratique de 3 jours ! Du 14 au 16 mai 2024 à Paris.

[Débutant] Amélioration fichier suite numérisation VHS

Discussion dans 'Transferts vidéo analogique vers numérique' créé par india_whisky, 22 Décembre 2020.

  1. maxtherence

    Points Repaire:
    1 200
    Recos reçues:
    1
    Messages:
    105
    Appréciations:
    +3 / 2 / -0
  2. india_whisky

    Points Repaire:
    100
    Recos reçues:
    0
    Messages:
    7
    Appréciations:
    +0 / 0 / -0
    Bonsoir à tous,
    J'ai essayé Film9, qui ne me donne pas plus de résultats que le logiciel dont je parlais dans mon post initial. Sous ShotCut, en ajoutant un filtre RGB Shift j'ai pu superposer 3 images qui étaient légèrement décalées (d'ailleurs, d'où vient ce décalage ?) Du coup, la bande rouge a disparu. J'ai également augmenté de 50% la netteté de l'image, ce qui rend l'ensemble un peu plus agréable. J'en reste là vu que les bandes horizontales sont dues au magnétoscope utilisé. Pour 5 VHS concernées sur 35, je vais temporiser pour le moment.

    J'en reviens à ma dernière question, le format issu de la numérisation est du MPG, un intérêt particulier à le laisser tel quel ? Ou vaut-il mieux ré encoder en FFV1 .mkv par exemple ?
     
  3. THEMASTER

    Points Repaire:
    1 970
    Recos reçues:
    11
    Messages:
    971
    Appréciations:
    +8 / 7 / -0
    Sur l'image que tu as postée il n'y pas que la bande rouge de droite il y aussi les traits blancs (dropouts je pense) et ça se nettoie bien avec avisynth.
    J'attend toujours un extrait de ta video...
     
  4. india_whisky

    Points Repaire:
    100
    Recos reçues:
    0
    Messages:
    7
    Appréciations:
    +0 / 0 / -0
    Oups désolé TheMaster.
    Voilà un extrait concerné.
    Dropbox - Sample.mp4 - Simplify your life
    Le problème finalement sous Shotcut est qu'une fois l'image retravaillée, j'ai beaucoup moins d'images par secondes. J'ai du louper une option lors du ré-encodage.
     
  5. THEMASTER

    Points Repaire:
    1 970
    Recos reçues:
    11
    Messages:
    971
    Appréciations:
    +8 / 7 / -0
  6. india_whisky

    Points Repaire:
    100
    Recos reçues:
    0
    Messages:
    7
    Appréciations:
    +0 / 0 / -0
    Incroyable.
    Quels sont ces réglages TheMaster ?
     
  7. Alcoriza

    So

    Points Repaire:
    8 200
    Recos reçues:
    97
    Messages:
    5 202
    Appréciations:
    +291 / 696 / -5
    Tu as un indice dans le nom du fichier qu'il t'a envoyé.
     
  8. Lacombe

    Points Repaire:
    2 120
    Recos reçues:
    11
    Messages:
    360
    Appréciations:
    +22 / 34 / -2
    Ce sujet m'intéresse beaucoup puique j'ai numérisé toute ma videotheque VHS, S-VHS, DV et HDV depuis 1987!
    J'ai repris des fichiers VHS de bonne qualité et essayé les deux softs mentionnés: Film9 et Studio transfer.
    Ils utilisent les mêmes logiciels et les mêmes codecs, mais l'interface et le tutorial de Studiotransfer est largement supérieur. De plus avec Film9, sur de longs projets (20 min et plus) j'au subi de nombreux plantages. Avec Studiotransfer aucun plantage et surtout une qualité du fichier brut de départ largement amélioré!
    Facilité du crop, bon réglages de la luminosité , contraste et balance des blancs et grande amélioration de la netteté sans augmentation notable du fourmillement de l'image. Je suis enchanté.
    Au point qu'un film VHS retravaillé reencodé en MP4 peut tout à fait être vu sur un videoprojecteur 4K sans honte et avec beaucoup de plaisir.
     
  9. THEMASTER

    Points Repaire:
    1 970
    Recos reçues:
    11
    Messages:
    971
    Appréciations:
    +8 / 7 / -0
    Pas de soucis le script que j'ai concocté c'est celui-ci:
    (il te faudra charger divers filtres avant ce script dont: ttempsmooth, fft3dfilter, mvtools, spotless, depulse, DeGrainMedian et je dois en oublier 1 ou 2


    Code:
    ## chargement des filtres ici:
    LoadPlugin("C:\Program Files (x86)\AviSynth 2.6\plugins\TTempSmooth\TTempSmooth.dll")
    etc.....
    SetMemoryMax(1200)
    SetMTMode(3,4)
    LWLibavVideoSource("Sample.mp4")
    
    ####### Pour enlever le bruit sur les canaux chromatiques (U et V) #######
    converttoyv12(matrix="Rec601",interlaced=false)
    U = UToY().ttempsmooth(maxr=1,lthresh=150, strength=1)
    V=VToY().ttempsmooth(maxr=1,lthresh=150, strength=1)
    YToUV(U,V,last)#
    
    ####### Pour enlever  des petits traits noirs (drop outs)  (noir uniquement) #######
    noisy   = last
    nonoise = FFT3DFilter(sigma=13,bt=1)
    diff    = 5                         # Difference between denoised and noisy clips
    m       = mt_lutxy(noisy,nonoise,"y x - "+string(diff)+" - 255 *")
    mt_merge(noisy,nonoise,m) # On Merge les 2 sources noisy et denoised
    
    ####### Pour enlever traits blancs  (drop outs) avec spotless et depulse #######
    SpotLess(last)
    converttoyuy2()
    DePulse(h=190, l=50, d=30, debug=false) # ok pour blanc, pas parfait
    converttoyv12(matrix="Rec601",interlaced=false)
    
    
    #######  Pour améliorer la video globalement, Attention !!! les valeurs  pour Manalyse doivent être sûrement à peaufiner car sinon ça peut créer des artéfacts#######
    # Video avec bcp de mouvement   / video avec peu de mouvement / se renseigner sur le forum doom9
    a=last
    #clense(reduceflicker=false).merge(last,0.5).clense(reduceflicker=false)
    mot=removegrain(8,0).DepanEstimate(range=2)
    take2=a.depaninterleave(mot,prev=2,next=2,subpixel=2).DeGrainMedian(limitY=255,limitUV=255,mode=2,norow=true,interlaced=false)
    clean1=take2.DeGrainMedian(limitY=255,limitUV=255,mode=0,norow=true,interlaced=false).selectevery(5,2)  # MODE 0 pour sample.mp4
    
    sup1 = clean1.minblur(1).removegrain(11,0)
     \           .mt_lutxy(clean1,"x 1 + y < x 2 + x 1 - y > x 2 - y ? ?",U=2,V=2)
     \           .msuper(pel=2,sharp=0)
    sup2 = a.msuper(pel=2,levels=1,sharp=2)
    ###### Good mvtools values, Do not change, checked##########
    bv22=sup1.manalyse(isb=true, truemotion=false,global=true,delta=2,blksize=16,overlap=8,search=5,searchparam=4,DCT=5)
    bv21=sup1.manalyse(isb=true, truemotion=false,global=true,delta=1,blksize=16,overlap=8,search=5,searchparam=4,DCT=5)
    fv21=sup1.manalyse(isb=false,truemotion=false,global=true,delta=1,blksize=16,overlap=8,search=5,searchparam=4,DCT=5)
    fv22=sup1.manalyse(isb=false,truemotion=false,global=true,delta=2,blksize=16,overlap=8,search=5,searchparam=4,DCT=5)
    
    interleave(a.mcompensate(sup2,fv22),a.mcompensate(sup2,fv21),a,a.mcompensate(sup2,bv21),a.mcompensate(sup2,bv22))
    mergeluma(TMedian2(),0.9).mergechroma(TMedian2(),1).selectevery(5,2)
    
    sup3 = last.msuper(pel=2,sharp=2)
    bv33=sup3.manalyse(isb=true, truemotion=false,global=true,delta=3,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    bv32=sup3.manalyse(isb=true, truemotion=false,global=true,delta=2,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    bv31=sup3.manalyse(isb=true, truemotion=false,global=true,delta=1,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    fv31=sup3.manalyse(isb=false,truemotion=false,global=true,delta=1,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    fv32=sup3.manalyse(isb=false,truemotion=false,global=true,delta=2,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    fv33=sup3.manalyse(isb=false,truemotion=false,global=true,delta=3,blksize=8,overlap=4,search=5,searchparam=4,DCT=5)
    last
    
    ##### Filtrage de la bande de couleur rouge à droite: #######
    # on peut faire mieux je pense notamment prendre la couleur de la video (vers la gauche) et la "dupliquer" dans cette partie de la video filtrée pour un rendu plus homogène. Voir sur doom9 ou forum videohelp
    
    filter_borders(last,0, 0, -30, -0)
    
    function filter_borders(clip c, int Left, int Top, int Right, int Bottom)
    {
      inner = Crop(c, 0, 0, -30, -0)
      # mettre les filtres ici:
    tweak(c,sat=0.0)
      Overlay(last, inner, Left, Top) # overlay unfiltered inner portion
    }
    
    ###  Fonctions nécessaires au bon fonctionnement de ce script ##############
    
    Function SpotLess(clip c,int "RadT",int "ThSAD",int "ThSAD2",int "pel",bool "chroma", int "BlkSz",Int "Olap",bool "tm",Bool "glob",Float "bBlur") {
        RadT     = Default(RadT,1)        # Temporal radius. (MCompensate arg)
        ThSAD    = Default(ThSAD,10000)   # SAD threshold at radius 1 (Default Nearly OFF).
        ThSAD2   = Default(ThSAD2,ThSAD)  # SAD threshold at radius RadT.
        Pel      = Default(pel,2)         # Default 2. 1, 2, or 4. Maybe set 1 for HD+. (1=precision to pixel, 2=precision to half pixel, 4=quarter pixel)
        Chroma   = Default(chroma,True)   # MAnalyse chroma arg. If set to true, use chroma in block matching.
        BlkSz    = Default(BlkSz,8)       # Default 8. MAnalyse BlkSize. Bigger blksz quicker and perhaps  better, esp for HD clips. Maybe also better where BIG noise.
        OLap     = Default(OLap, BlkSz/2) # Default half of BlkSz.
        Tm       = Default(tm,True)       # TrueMotion, Some folk swear MAnalyse(truemotion=false) is better.
        Glob     = Default(glob,Tm)       # Default Tm, Allow set MAnalyse(global) independently of TrueMotion.
        Bblur    = Default(bblur,0.0)     # Default OFF
        Assert(1 <= RadT,"SpotLess: 1 <= RadT")
        pad      = max(BlkSz,8)
        sup      = (bBlur<=0.0  ? c   : c.blur(bblur)).MSuper(hpad=pad,vpad=pad,pel=pel,sharp=2)
        sup_rend = (bBlur<=0.0) ? sup : c.MSuper(hpad=pad,vpad=pad,pel=pel,sharp=2,levels=1) # Only 1 Level required where not MAnalyse-ing.
        MultiVec = sup.MAnalyse(multi=true, delta=RadT,blksize=BlkSz,overlap=OLap,search=4,chroma=Chroma,truemotion=Tm,global=Glob)
        c.MCompensate(sup_rend,MultiVec,tr=RadT,thSad=ThSAD,thSad2=ThSAD2)
        MedianBlurTemporal(radiusY=0,radiusU=0,radiusV=0,temporalradius=RadT)  # Temporal median blur only [not spatial]
        SelectEvery(RadT*2+1,RadT)                                             # Return middle frame
    }
    
    
    #################################################################
    function EdgeCleaner(clip c, float "strength", bool "rep", int "rmode", int "smode", bool "hot", bool "fix") {
        strength    = default(strength, 8.0)
        rep         = default(rep, true)
        rmode       = default(rmode, 17)
        smode       = default(smode, 0)
        hot         = default(hot, false)
        fix         = default(fix, true)
        c           = (c.isYV12()) ? c : c.ConvertToYV12()
        strength    = (smode==0) ? strength : strength+4
        main        = c.aWarpSharp(strength,1)
        main        = (rep) ? Repair(main,c,rmode) : main
        mask        = c.mt_edge("prewitt",4,32,4,32).mt_invert().mt_convolution()
        final       = (!hot) ? mt_merge(c,main,mask) : Repair(mt_merge(c,main,mask),c,2)
        final       = (fix) ? Overlay(final,c.ConvertToRGB24().Crop(0,1,-c.width+1,-c.height+2),x=0,y=1) : final
        final       = (smode != 0) ? mt_merge(final,c,c.StarMask(smode)) : final
        return final
    }
    function StarMask(clip c, int "mode") {
        mode        = default(mode, 1)
        clean       = (mode==1) ? c.RemoveGrain(17) : Repair(c.Deen("a3d",4,12,0),c,15).RemoveGrain(21)
        diff        = (mode==1) ? mt_makediff(c,clean) : NOP
     
        final       = (mode==1) ? diff.Greyscale().Levels(40,0.350,168,0,255).removegrain(7,-1).mt_edge("prewitt",4,16,4,16) : \
                      Subtract(mt_merge(clean,c,c.mt_edge("roberts",0,2,0,2).mt_expand(mode=mt_circle(1)).mt_invert()),c).mt_edge("roberts",0,0,0,0).mt_deflate()
     
        return final
    }
    
    
    
    function MinBlur(clip clp, int r, int "uv")
    {
    uv   = default(uv,3)
    uv2  = (uv==2) ? 1 : uv
    rg4  = (uv==3) ? 4 : -1
    rg11 = (uv==3) ? 11 : -1
    rg20 = (uv==3) ? 20 : -1
    medf = (uv==3) ? 1 : -200
    
    RG11D = (r==0) ? mt_makediff(clp,clp.sbr(),U=uv2,V=uv2)
     \    : (r==1) ? mt_makediff(clp,clp.removegrain(11,rg11),U=uv2,V=uv2)
     \    : (r==2) ? mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20),U=uv2,V=uv2)
     \    :          mt_makediff(clp,clp.removegrain(11,rg11).removegrain(20,rg20).removegrain(20,rg20),U=uv2,V=uv2)
    RG4D  = (r<=1) ? mt_makediff(clp,clp.removegrain(4,rg4),U=uv2,V=uv2)
     \    : (r==2) ? mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2)
     \    :          mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2)
    DD    = mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
    clp.mt_makediff(DD,U=uv,V=uv)
    return(last)
    }
    
    
    
    # median of 5 clips from Helpers.avs by G-force
    Function Median2(clip "input_1", clip "input_2", clip "input_3", clip "input_4", clip "input_5", string "chroma")
    {
    chroma = default(chroma,"process") #default is "process". Alternates: "copy first" or "copy second"
    #MEDIAN(i1,i3,i5)
    Interleave(input_1,input_3,input_5)
    chroma == "process" ? Clense(reduceflicker=false) : Clense(reduceflicker=false,grey=true)
    m1 = selectevery(3,1)
    #MAX(MIN(i1,i3,i5),i2)
    m2  = input_1.MT_Logic(input_3,"min",chroma=chroma).MT_Logic(input_5,"min",chroma=chroma).MT_Logic(input_2,"max",chroma=chroma)
    #MIN(MAX(i1,i3,i5),i4)
    m3  = input_1.MT_Logic(input_3,"max",chroma=chroma).MT_Logic(input_5,"max",chroma=chroma).MT_Logic(input_4,"min",chroma=chroma)
    Interleave(m1,m2,m3)
    chroma == "process" ? Clense(reduceflicker=false) : Clense(reduceflicker=false,grey=true)
    selectevery(3,1)
    chroma == "copy first" ? last.MergeChroma(input_1) : chroma == "copy second" ? last.MergeChroma(input_2) : last
    ConverttoRGB32(matrix="rec601",interlaced=false)
    LoadVirtualDubPlugin("C:\Program Files (x86)\VirtualDub\plugins\Camcorder_Color_Denoise_sse2.vdf", "CCD", 1)
    CCD(7,1) # de 0 à 100 # Défaut =30 /
    converttoyv12(matrix="rec601",interlaced=false)
    Return(last)
    }
    
    function TMedian2(clip c) {
    Median2( c.selectevery(1,-2), c.selectevery(1,-1), c, c.selectevery(1,1), c.selectevery(1,2) ) }
    
    
    function RemoveDirt(clip input, int limit, bool _grey)
    {
      clensed=input.Clense(grey=_grey, cache=4)
      alt=input.RemoveGrain(2)
      return RestoreMotionBlocks(clensed,input,alternative=alt,pthreshold=6,cthreshold=8, gmthreshold=40,dist=3,dmode=2,debug=false,noise=limit,noisy=4, grey=_grey)
    
      # Alternative settings
      # return RestoreMotionBlocks(clensed,input,alternative=alt,pthreshold=4,cthreshold=6, gmthreshold=40,dist=1,dmode=2,debug=false,noise=limit,noisy=12,grey=_grey,show=true)
      # return RestoreMotionBlocks(clensed,input,alternative=alt,pthreshold=6,cthreshold=8, gmthreshold=40,dist=3,tolerance= 12,dmode=2,debug=false,noise=limit,noisy=12,grey=_grey,show=false)
    }

    Modération : Code mis dans balises pour faciliter la lecture de la discussion
     
    #24 THEMASTER, 7 Janvier 2021
    Dernière édition par un modérateur: 7 Janvier 2021
Chargement...

Partager cette page