Il existe trois méthodes simples pour exploiter ESRGAN dans QGIS (voir l’article précédent).
La première – la plus flexible – consiste à ajouter un script Python dans la Processing Toolbox de QGIS.



Intégration via un script Python (Processing Toolbox)

Cette approche permet d’appeler ESRGAN directement depuis QGIS, comme n’importe quel algorithme de traitement.
L’utilisateur sélectionne un raster → ESRGAN l’améliore → QGIS recharge automatiquement le fichier résultant.

Principe

Le script Python :

  1. prend un raster d’entrée, appartenant déjà au projet QGIS ;
  2. appelle Real-ESRGAN (version NCNN Vulkan ou PyTorch) en ligne de commande ;
  3. gère le fichier de sortie (nom, chemin, géoréférencement si nécessaire) ;
  4. charge automatiquement la version améliorée dans QGIS.


Exemple de script (version NCNN Vulkan recommandée)

Ce script fonctionne en appelant l’exécutable :
realesrgan-ncnn-vulkan.exe

Il suppose que :

  • Real-ESRGAN-ncnn-vulkan se trouve dans : C:/SR/realesrgan-ncnn-vulkan-20220424-windows/
  • On veut générer un fichier suffixé _sr.tif
  • Le géoréférencement doit être repris depuis le raster d’origine (via GDAL)

Tu pouvez l’adapter selon votre installation.


Script QGIS (à copier dans : Processing → Scripts → Nouveau script)

esrgan_superresolution.py

from qgis.core import (
    QgsProcessingAlgorithm,
    QgsProcessingParameterRasterLayer,
    QgsProcessingParameterNumber,
    QgsProcessingParameterEnum,
    QgsProcessingParameterRasterDestination,
    QgsProcessingException
)
import os
import subprocess
from osgeo import gdal, osr

class ESRGANSuperResolution(QgsProcessingAlgorithm):

    def initAlgorithm(self, config=None):
        self.addParameter(
            QgsProcessingParameterRasterLayer("INPUT_RASTER", "Raster d’entrée")
        )
        self.addParameter(
            QgsProcessingParameterNumber(
                "SCALE",
                "Facteur d’agrandissement",
                type=QgsProcessingParameterNumber.Integer,
                defaultValue=4
            )
        )
        self.addParameter(
            QgsProcessingParameterEnum(
                "MODEL",
                "Modèle ESRGAN",
                options=["realesrgan-x4plus", "realesrgan-x4plus-anime", "realesrnet-x4plus"],
                defaultValue=0
            )
        )
        self.addParameter(
            QgsProcessingParameterRasterDestination("OUTPUT_RASTER", "Raster de sortie")
        )

    def processAlgorithm(self, parameters, context, feedback):
        input_layer = self.parameterAsRasterLayer(parameters, "INPUT_RASTER", context)
        if input_layer is None:
            raise QgsProcessingException("Raster d’entrée invalide.")
        
        input_raster = input_layer.source()
        scale = self.parameterAsInt(parameters, "SCALE", context)
        model_index = self.parameterAsInt(parameters, "MODEL", context)
        output_raster = self.parameterAsOutputLayer(parameters, "OUTPUT_RASTER", context)

        exe = r"C:/SR/realesrgan-ncnn-vulkan-20220424-windows/realesrgan-ncnn-vulkan.exe"
        if not os.path.exists(exe):
            raise QgsProcessingException("Executable Real-ESRGAN introuvable : " + exe)

        # Fichiers temporaires
        tmp_png = os.path.splitext(input_raster)[0] + "_tmp.png"
        sr_png = os.path.splitext(input_raster)[0] + "_sr.png"

        model_list = ["realesrgan-x4plus", "realesrgan-x4plus-anime", "realesrnet-x4plus"]
        model_name = model_list[model_index]

        # -----------------------------
        # Conversion vers PNG
        feedback.pushInfo("Conversion en PNG…")
        subprocess.run(["gdal_translate", "-of", "PNG", input_raster, tmp_png], check=True)

        # -----------------------------
        # Super-résolution ESRGAN
        feedback.pushInfo("Exécution ESRGAN…")
        subprocess.run([exe, "-i", tmp_png, "-o", sr_png, "-n", model_name, "-s", str(scale)], check=True)

        # -----------------------------
        # Calcul de la nouvelle géotransformation
        src = gdal.Open(input_raster)
        gt = src.GetGeoTransform()
        proj = src.GetProjection()
        # Ajustement du pixel pour conserver l'emprise
        new_gt = (gt[0], gt[1]/scale, gt[2], gt[3], gt[4], gt[5]/scale)

        # Création du worldfile pour sr_png
        wld_path = sr_png.replace(".png", ".wld")
        with open(wld_path, "w") as f:
            f.write(f"{new_gt[1]}\n{new_gt[2]}\n{new_gt[4]}\n{new_gt[5]}\n{new_gt[0]}\n{new_gt[3]}\n")

        # Création du .prj
        srs = osr.SpatialReference()
        srs.ImportFromWkt(proj)
        prj_path = sr_png.replace(".png", ".prj")
        with open(prj_path, "w") as f:
            f.write(srs.ExportToWkt())

        # -----------------------------
        # Reprojection / création du TIF final
        feedback.pushInfo("Création du TIF final…")
        subprocess.run([
            "gdalwarp",
            "-t_srs", src.GetProjection(),
            sr_png, output_raster
        ], check=True)

        # -----------------------------
        # Nettoyage
        for f in [tmp_png, sr_png, wld_path, prj_path]:
            if os.path.exists(f):
                os.remove(f)

        return {"OUTPUT_RASTER": output_raster}

    def name(self):
        return "esrgan_super_resolution"

    def displayName(self):
        return "Super-résolution ESRGAN (NCNN)"

    def group(self):
        return "Super-Résolution"

    def groupId(self):
        return "super_resolution"

    def createInstance(self):
        return ESRGANSuperResolution()


Comment installer ce script dans QGIS ?

  1. Ouvrez QGIS
  2. Allez dans :
    Traitements → Boîte à outils → Scripts → Ouvrir le dossier des scripts
  3. Créez un nouveau fichier :
    esrgan_superresolution.py
  4. Collez le script ci-dessus
  5. Redémarrez QGIS

Vous verrez apparaître :

Scripts → Super-résolution Real-ESRGAN (NCNN)


Comment l’utiliser ?

  1. Chargez une ortho, photo ancienne, ou tout raster dans QGIS
  2. Ouvrez :
    Traitements → Scripts Super-résolution
  3. Choisissez :

    • Raster d’entrée
    • Facteur ×4
    • Modèle ESRGAN
    • Raster de sortie

  4. Lancez

→ Le raster super-résolu apparaît directement sur la carte QGIS.


Avantages de cette méthode

  • Intégration propre dans QGIS
  • Fonctionne sans GPU (NCNN Vulkan = CPU + GPU Intel)
  • Résultats reproductibles
  • Aucune modification de QGIS n’est nécessaire
  • Possibilité d’intégrer ensuite dans un chaînage de traitements


Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *