Page 1 sur 1

floutage avec Avisynth

Posté : sam. 10 nov., 2012 18:19
par leon1789
Bonjour

Voici un petit script avisynth qui permet de flouter une zone rectangulaire (sous-titres ou logo) d'une vidéo.
ZoneFloue (clip v, int x, int y, int width, int height, bool "show", int "frame_begin", int "frame_end")

v désigne la vidéo
x,y désignent les coordonnées du sommet en haut à gauche du rectangle à flouter
width, height désignent respectivement la largeur et la hauteur du rectangle à flouter
show (optionnel) est un booléen qui permet, si show=true, de voir sur l'image le rectangle à flouter.
frame_begin et frame_end (optionels) désignent les images entre lesquelles on floute (frames incluses).

Le script est disponible ici : http://leon1789.perso.sfr.fr/avisynth/ZoneFloue.zip
Dans ce fichier zip, il y a la librairie mt_masktools.dll dont le script a besoin.

Exemple d'utilisation :
On veut flouter le sous-titre de cette image

(image tirée "textuellement" du film Apocalyto... :ange: )

On place un rectangle "virtuel" à l'endroit où se trouve le sous-titre :

Ici x=202 , y=320 , width=300, height=54

Pour obtenir l'image finale, le code avisynth est simplement video.ZoneFloue(202,320,300,54)


On peut aussi vouloir flouter certains passages, en précisant un ou plusieurs intervalles d'images :

Code : Tout sélectionner

video=video.zonefloue(x,y,largeur,hauteur)                                   # flou sur toute la vidéo (comme avant) 
video=video.zonefloue(x,y,largeur,hauteur, frame_end=20)                     # flou jusqu'à l'image n°20 (en partant du début) 
video=video.zonefloue(x,y,largeur,hauteur, frame_begin=30, frame_end=200)    # flou entre les images 30 et 200 
video=video.zonefloue(x,y,largeur,hauteur, frame_begin=300, frame_end=300)   # flou sur une seule image, la n°300 
video=video.zonefloue(x,y,largeur,hauteur, frame_begin=100)                  # flou à partie de l'image 100 (jusqu'à la fin de la vidéo) 
Bien sûr, les arguments x,y,largeur, hauteur peuvent être de valeurs différentes d'une ligne à l'autre.

Posté : sam. 10 nov., 2012 18:22
par leon1789
J'ai testé ce script sur le sous-titre ci-dessus, et également sur le logo d'une chaîne de télé. Ca fonctionne bien. Mais ce ne sont que 2 exemples en définition standard. Reste à voir comment se comporte le script sur d'autres exemples et en HD (normalement, il ne doit pas y avoir davantage de soucis quand SD).

Posté : sam. 10 nov., 2012 22:51
par Subbat
Franchement pas mal... Si on cherche pas le détail, on premier coup d'œil c'est vraiment bien je trouve...

Posté : dim. 11 nov., 2012 4:17
par pepsilite
Héhé, je vais tester ça :D

Posté : dim. 11 nov., 2012 4:28
par pepsilite
Waw, c'est très impressionnant, en plus pas besoin de layer avec une deuxième vidéo, le gain en ressource est aussi non négligeable, bravo Léon :D

Posté : dim. 11 nov., 2012 10:06
par leon1789
Merci :)

Comparé au code implémenté de m4ng, ma proposition ZoneFloue est deux fois moins rapide (sur mon ordi). Cela dit, ZoneFloue reste très rapide tout de même (deux fois plus rapide qu'un resize de l'image par exemple).

Mais bon, le résultat de ZoneFloue n'est pas sans défaut : parfois, le floutage est assez choquant...

Posté : dim. 11 nov., 2012 14:19
par pepsilite
Comment ça peut être moins rapide que le code actuel de m4ng v3 vu qu'il doit gérer vidéos distinctes pour générer l'effet flou?

Posté : dim. 11 nov., 2012 17:05
par leon1789
le code de m4ng est

Code : Tout sélectionner

(...)
Video2=Video
Video2=Crop(Video2, 512, 340, 82, 30)
LoadPlugin("C:\PROGRA~2\m4ng_v3\system\VariableBlur.dll")
Video2=variableblur(Video2,rady=250,Y=3,U=3,V=3,gaussian=true)
Video=ConvertToYUY2(Video)
Video2=ConvertToYUY2(Video2)
Video=Layer(Video, Video2, "add", 255, 512, 340)
Video=ConvertToYV12(Video)
(...)
Il y a bien la variable video2 à gérer, mais la résolution de video2 est toute petite car c'est la région à flouter ( --> crop) . Du coup, l'opération de variableblur qui s'effectue dessus est rapide. Après, il y a les fonctions Convert et Layer, mais elles vont vite.

Du coté de ZoneFloue.avsi , il y a plein de manipulations de la zone à flouter (variable f dans le code) pour éliminer le logo et un masque de floutage en plus (variable masq dans le code) pour avoir les bords de la zone floutée plus "fondus" dans la vidéo.

Posté : dim. 11 nov., 2012 17:33
par pepsilite
Ah ouais, peut-être, chez moi ça ne se remarque pas en tout cas.

Posté : sam. 26 mars, 2016 21:20
par leon1789
Mise à jour le 26 03 2016

Posté : lun. 28 mars, 2016 17:35
par pepsilite
Cool ...