{"id":80,"date":"2026-01-07T11:33:22","date_gmt":"2026-01-07T10:33:22","guid":{"rendered":"https:\/\/heddalab.com\/?post_type=projets&#038;p=80"},"modified":"2026-03-31T10:03:54","modified_gmt":"2026-03-31T08:03:54","slug":"agx","status":"publish","type":"projets","link":"https:\/\/heddalab.com\/?projets=agx","title":{"rendered":"AGX : Automatiser le d\u00e9veloppement des n\u00e9gatifs argentiques"},"content":{"rendered":"\n<ul class=\"wp-block-social-links has-large-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-a89b3969 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/cecile-umecker\/AGX\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li><\/ul>\n\n\n\n<p>Si vous pratiquez la photographie argentique, vous connaissez le dilemme : payer une fortune pour des scans de labo souvent trop compress\u00e9s, ou passer des heures \u00e0 num\u00e9riser manuellement ses n\u00e9gatifs avec un appareil photo num\u00e9rique.<\/p>\n\n\n\n<p>C\u2019est pour r\u00e9soudre ce probl\u00e8me que j&rsquo;ai d\u00e9velopp\u00e9 <strong>AGX (Automated Grain Xtractor)<\/strong>, un outil en ligne de commande (CLI) qui transforme vos scans RAW de n\u00e9gatifs en fichiers TIFF 16-bit positifs, pr\u00eats pour le post-traitement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Le setup de num\u00e9risation<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"242\" src=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-300x242.jpg\" alt=\"\" class=\"wp-image-142\" srcset=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-300x242.jpg 300w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-1024x825.jpg 1024w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-768x619.jpg 768w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-1536x1238.jpg 1536w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh-1170x943.jpg 1170w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Gemini_Generated_Image_ynghrkynghrkyngh.jpg 1764w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Pour num\u00e9riser mes pellicules, j&rsquo;utilise une m\u00e9thode artisanale mais pr\u00e9cise : un smartphone (48mpx) mont\u00e9 sur un tr\u00e9pied, une source de lumi\u00e8re uniforme (une tablette lumineuse), et un masque en papier Canson pour caler le film. Le probl\u00e8me ? Chaque photo RAW captur\u00e9e contient les bords noirs du masque et n\u00e9cessite une inversion manuelle laborieuse.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi utiliser AGX ?<\/h2>\n\n\n\n<p>D\u00e9velopper un n\u00e9gatif num\u00e9rique ne se r\u00e9sume pas \u00e0 un simple \u00ab\u00a0Inverser les couleurs\u00a0\u00bb dans Photoshop. Pour pr\u00e9server le grain et la plage dynamique, il faut respecter une cha\u00eene de traitement stricte. AGX automatise les \u00e9tapes les plus ingrates :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Smart Crop : L&rsquo;outil d\u00e9tecte automatiquement la zone \u00e9clair\u00e9e du film au milieu des bordures noires et recadre l&rsquo;image tout seul.<\/li>\n\n\n\n<li>Traitement Lin\u00e9aire : AGX travaille en 16-bit tout au long du pipeline. Aucune donn\u00e9e n&rsquo;est perdue.<\/li>\n\n\n\n<li>Inversion Intelligente : L&rsquo;inversion et la normalisation des niveaux (Auto-levels) se font sur le contenu r\u00e9el de la photo, en ignorant les marges ou les perforations qui faussent souvent les calculs.<\/li>\n\n\n\n<li>Traitement par lot (Batch) : Une commande, et tout votre dossier est trait\u00e9e avec une barre de progression.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Mon workflow : du RAW au positif<\/h2>\n\n\n\n<p>Voici comment je proc\u00e8de pour chaque pellicule :<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Capture : Je photographie position par position mes n\u00e9gatifs au format RAW pour capter un maximum d&rsquo;informations.<\/li>\n\n\n\n<li>Traitement AGX : Je lance une simple commande <em><strong>agx &lt;dossier_raw&gt; &lt;dossier_sortie&gt;<\/strong><\/em><\/li>\n\n\n\n<li>D\u00e9veloppement final : AGX me sort des fichiers TIFF propres. Je n&rsquo;ai plus qu&rsquo;\u00e0 ajuster le recadrage, les contrastes et les couleurs selon mon go\u00fbt.<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Comparaison : avant \/ apr\u00e8s AGX<\/h2>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-112634-e1772793215502.png\" alt=\"\" class=\"wp-image-143\" style=\"aspect-ratio:4\/3;object-fit:contain\"\/><figcaption class=\"wp-element-caption\">Avant AGX<\/figcaption><\/figure>\n\n\n\n<p><\/p>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"462\" height=\"365\" src=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-112957-e1772793318361.png\" alt=\"\" class=\"wp-image-144\" style=\"aspect-ratio:4\/3;object-fit:cover\" srcset=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-112957-e1772793318361.png 462w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-112957-e1772793318361-300x237.png 300w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><figcaption class=\"wp-element-caption\">Apr\u00e8s AGX<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"327\" src=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-113227.png\" alt=\"\" class=\"wp-image-145\" style=\"aspect-ratio:4\/3;object-fit:cover\" srcset=\"https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-113227.png 466w, https:\/\/heddalab.com\/wp-content\/uploads\/2026\/03\/Capture-decran-2026-03-06-113227-300x211.png 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><figcaption class=\"wp-element-caption\">Apr\u00e8s traitement basique sur GIMP<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>On voit clairement comment AGX r\u00e9cup\u00e8re les d\u00e9tails dans les ombres et les hautes lumi\u00e8res sans br\u00fbler les blancs, l\u00e0 o\u00f9 un outil standard aurait pu se tromper \u00e0 cause des bords noirs.<\/p>\n\n\n\n<p>Gr\u00e2ce \u00e0 AGX, le pr\u00e9-traitement de 70 fichiers RAW ne prend que quelques millisecondes, me permettant de consacrer mes dix minutes de retouche sur GIMP uniquement \u00e0 l&rsquo;artistique. Sans cet outil, la conversion manuelle de chaque n\u00e9gatif aurait pris plus de 20 minutes par image, avec un r\u00e9sultat souvent fluctuant et impr\u00e9cis.\u00a0\u00bb<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pour les curieux du code<\/h2>\n\n\n\n<p>AGX est cod\u00e9 en <strong>Python<\/strong> et s&rsquo;appuie sur des biblioth\u00e8ques robustes comme <code><em>rawpy<\/em><\/code> pour la lecture des RAW et <code><em>numpy<\/em><\/code> pour la manipulation des matrices d&rsquo;images. C&rsquo;est un outil pens\u00e9 par un photographe, pour les photographes.<\/p>\n\n\n\n<p>Le projet est disponible en Open Source sur mon GitHub :<\/p>\n\n\n\n<ul class=\"wp-block-social-links has-large-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-a89b3969 wp-block-social-links-is-layout-flex\"><li class=\"wp-social-link wp-social-link-github  wp-block-social-link\"><a href=\"https:\/\/github.com\/cecile-umecker\/AGX\" class=\"wp-block-social-link-anchor\"><svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" version=\"1.1\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z\"><\/path><\/svg><span class=\"wp-block-social-link-label screen-reader-text\">GitHub<\/span><\/a><\/li><\/ul>\n\n\n\n<p><\/p>\n","protected":false},"featured_media":81,"template":"","categories":[],"class_list":["post-80","projets","type-projets","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/heddalab.com\/index.php?rest_route=\/wp\/v2\/projets\/80","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/heddalab.com\/index.php?rest_route=\/wp\/v2\/projets"}],"about":[{"href":"https:\/\/heddalab.com\/index.php?rest_route=\/wp\/v2\/types\/projets"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/heddalab.com\/index.php?rest_route=\/wp\/v2\/media\/81"}],"wp:attachment":[{"href":"https:\/\/heddalab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=80"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/heddalab.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=80"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}