Le focus stacking en 5 min, de l'acquisition au post-traitement compris, ça vous tente ?
Je profite de mon retour pour partager une nouvelle version du script Linux de focus stacking créé il a quelques années, mais cette fois-ci pour une acquisition au format vidéo.
Nous avions longuement parlé des problèmes causés par les vibrations (si besoin, voir cette page de Charles Krebs), de la possibilité de relever le miroir d'un Reflex avant la prise de vue, etc. Par ailleurs, j'ai beaucoup appris sur le forum grâce à vous tous concernant les gammes d'optiques et leurs qualités respectives.
J'ai coutume de réaliser mes tests avec des basidiospores de Russula montées dans le réactif de Melzer pour mettre en évidence l'ornementation sporale. J'ai déjà eu l'occasion de présenter des résultats similaires à partir de clichés individuels. Cependant, à partir d'une vidéo, l'acquisition ne prend plus que quelques secondes pour une qualité comparable... j'ajoute que c'est une façon commode de remettre en service un Canon 500D qui capture en full HD. Côté optique c'est un Olympus SPanApo 100 ON 1.4 à immersion à l'huile et un projectif Olympus NFK 1.67x. Le condenseur est l'universel d'Olympus, à lentille frontale ON 0.9.
Un lien box.net vers la vidéo de cet exemple (trop volumineuse pour être hébergée ici) et l'image finale ci-dessous (après un léger crop manuel).
Le script est ci-dessous. Il se déroule en trois étapes principales : (1) extraction des images (frames) à partir de la vidéo, (2) alignement des images et (3) focus stacking proprement dit. J'utilise ffmpeg pour la première étape, mais on peut aussi utiliser vlc ou d'autres outils. La troisième étape implique enfuse, mais certains logiciels de focus stacking ont une version en ligne de commande (notamment Zerene Stacker).
- Code: Tout sélectionner
#! /bin/bash
LOG="log"
BASE="$(basename "$1" .MOV)"
FRAMES="8"
FORMAT="frame%03d.tif"
function ensure_exists() {
which $1 > /dev/null || (echo "Error: $1 not found."; exit 2)
}
mkdir -p "$BASE" # Dossier contenant les images.
mkdir -p "$LOG" # Dossier contenant les fichiers log.
echo "Script de focus stacking version 2.0 (mode vidéo)"
echo -n "* Extraction d'une image sur $FRAMES à partir de $(basename $1)... "
ensure_exists "ffmpeg"
# Des vibrations se produisent souvent pendant la première seconde, lorsqu'on
# enclenche la vidéo. Pour cette raison, les images correspondantes ne sont pas
# extraites. On extrait également une image sur 10.
# Référence : https://superuser.com/a/391749
ffmpeg -ss 00:00:01 -i "$1" \
-vf "select=not(mod(n\,$FRAMES))" \
-vsync vfr \
-compression_algo raw \
-pix_fmt rgb24 \
"$BASE/$FORMAT" &> "$LOG/ffmpeg.log"
echo "OK ($(ls "$BASE/$tif" | wc -l) images)"
cd $BASE
ensure_exists "rename"
rename 'y/A-Z/a-z/' *
echo -n "* Correction de l'alignement et création des masques... "
ensure_exists "align_image_stack"
align_image_stack -v --gpu -C -i -a mask *.tif > "../$LOG/align_image_stack.log"
echo "OK"
echo -n "* Calcul de l'image finale... "
ensure_exists "enfuse"
enfuse -o "../$BASE.tif" \
--exposure-weight=0 \
--saturation-weight=0 \
--contrast-weight=1 \
--hard-mask \
--contrast-window-size=5 \
--compression=lzw \
mask*.tif &> "../$LOG/enfuse.log"
echo "OK"
cd ..
echo -n "* Post-traitement et conversion JPEG... "
ensure_exists "convert"
convert "$BASE.tif" \
-colorspace Gray \
-normalize \
-unsharp 2 \
-quality 100 \
"$BASE.jpg"
echo "OK"
echo -n "* Effacement des fichiers intermédiaires... "
rm -rf "$BASE" "$BASE.tif"
echo "OK"
Pour toute question n'hésitez pas ! Bonnes observations
Cordialement,
Eddy