Version 1.0#

Sigima Version 1.0.6#

🛠️ Correctifs :

  • Compatibilité avec scikit-image 0.26.0+ : Correction des avertissements de dépréciation et des problèmes de compatibilité API

    • scikit-image 0.26.0 a introduit des changements majeurs dans les API de CircleModel et EllipseModel : l’ancienne API utilisait model.estimate(contour) + model.params, la nouvelle API utilise model.from_estimate(contour) + un accès basé sur les propriétés (model.center, model.radius, model.axis_lengths)

    • Ajout d’une couche de compatibilité sensible à la version dans sigima.tools.image.preprocessing avec de nouvelles fonctions d’aide fit_circle_model() et fit_ellipse_model() qui gèrent les anciennes et nouvelles API

    • Mise à jour de get_contour_shapes() dans sigima.tools.image.detection pour utiliser les fonctions de compatibilité

    • Mise à jour de get_enclosing_circle() dans sigima.tools.image.geometry pour utiliser les fonctions de compatibilité

    • Utilisation de packaging.version.Version pour une vérification robuste des versions au lieu d’une analyse de chaîne fragile

    • Élimine les avertissements de dépréciation tout en maintenant la compatibilité ascendante avec Python 3.9 et scikit-image < 0.26

    • Ceci clôture Issue #10 - Sigima n’est pas compatible avec NumPy 2.4.0 et scikit-image 0.26.0

  • Compatibilité avec NumPy 2.4.0 : Correction de l’échec du calcul du centroïde avec la nouvelle optimisation einsum de NumPy 2.4.0

    • NumPy 2.4.0 a introduit une nouvelle optimisation einsum utilisée par scikit-image.measure.centroid() qui échoue avec certains types de ndarray

    • Correction en convertissant explicitement les données d’image en tableau NumPy de base avant d’appeler measure.centroid() dans la fonction get_centroid_auto()

    • Assure la compatibilité avec NumPy 2.4.0+ et scikit-image 0.26.0+ sans modifier les résultats de calcul

📦 Dépendances :

  • Contraintes de version des dépendances : Ajout de contraintes de version maximale pour éviter les futurs problèmes de compatibilité

    • Mise à jour des spécifications des dépendances : NumPy >= 1.22, < 2.5, SciPy >= 1.10.1, < 1.17, scikit-image >= 0.19.2, < 0.27, pandas >= 1.4, < 3.0, PyWavelets >= 1.2, < 2.0

    • Le nouveau job CI build_latest exécute des tests programmés contre les dernières versions des dépendances pour détecter rapidement les changements majeurs

    • Permets d’éviter les régressions dues aux mises à jour majeures des dépendances tout en permettant des mises à niveau contrôlées après validation

🚀 Améliorations CI/CD :

  • Améliorations du workflow CI : Ajout de tests automatisés contre les dernières versions des dépendances

    • Nouveau job build_latest dans GitHub Actions s’exécute selon un calendrier (hebdomadaire) et sur demande manuelle

    • Extrait les noms des dépendances de pyproject.toml et installe les dernières versions disponibles

    • Fournit un système d’alerte précoce pour les futurs problèmes de compatibilité des dépendances

    • Amélioration du workflow de déclenchement avec une sélection de jobs configurable pour des scénarios de test flexibles

Sigima Version 1.0.5 (19/12/2025)#

ℹ️ Ceci est une version corrective qui résout un problème d’emballage où les traductions françaises manquaient dans le package de la version précédente. Cette version ne contient aucun changement fonctionnel par rapport à la version 1.0.4 - elle garantit uniquement que les fichiers de traduction compilés (.mo) sont correctement inclus dans le package de distribution.

🛠️ Correctifs :

  • Packaging : Correction des fichiers de traduction française manquants dans le package de la version précédente

    • Les packages de la version précédente ne contenaient pas les fichiers de traduction compilés .mo, ce qui faisait que l’application affichait uniquement du texte en anglais quel que soit les paramètres régionaux

    • Mise à jour du processus de construction pour garantir que tous les fichiers de traduction sont correctement inclus dans les packages de distribution

    • Aucun changement de code fonctionnel - il s’agit purement d’une correction d’emballage pour restaurer la prise en charge de l’internationalisation

Sigima Version 1.0.4 (18/12/2025)#

🛠️ Correctifs :

  • Traitement d’image : plage LUT copiée incorrectement dans le résultat : Correction des images traitées affichant un contraste incorrect car la plage LUT a été copiée de l’original

    • Lors du traitement d’une image (par exemple, en soustrayant un offset), l’image résultante héritait de la plage LUT de l’original (zscalemin/zscalemax), ce qui entraînait une visualisation incorrecte lorsque les valeurs de données changeaient de manière significative

    • Exemple : Après avoir soustrait un fond d’environ 50 lsb d’une image avec une LUT de 50-200, le résultat (plage de données d’environ -5 à environ 175) était toujours affiché avec la LUT originale de 50-200, rendant certaines parties de l’image coupées ou invisibles

    • Corrigé en ajoutant des fonctions wrapper spécifiques à l’image dst_1_to_1, dst_2_to_1 et dst_n_to_1 dans sigima.proc.image.base qui réinitialisent la plage LUT après la copie de l’image source

    • La méthode ImageObj.copy() reste inchangée (une copie doit copier fidèlement tous les attributs) - la correction est appliquée à la couche de traitement où elle appartient

    • Ajout d’un test de régression test_image_offset_correction_lut_range dans offset_correction_unit_test.py

    • Ceci clôture Issue #9 - Plage LUT copiée incorrectement lors du traitement des images

  • Une ROI rectangulaire définie à l’envers entraîne des statistiques NaN : Correction de la normalisation des coordonnées de ROI rectangulaire lorsqu’elle est définie en sens inverse

    • Lorsqu’une ROI rectangulaire était dessinée graphiquement « à l’envers » dans DataLab (du coin inférieur droit vers le coin supérieur gauche au lieu du coin supérieur gauche vers le coin inférieur droit), l’analyse statistique retournait des valeurs NaN

    • La méthode RectangularROI.rect_to_coords() produisait des valeurs Δx et Δy négatives lorsque x1 < x0 ou y1 < y0

    • Corrigé en normalisant les coordonnées avec min/max pour garantir que Δx et Δy sont toujours positifs

    • La génération du masque de ROI fonctionne désormais correctement quelle que soit la direction dans laquelle le rectangle a été dessiné

    • Ajout d’un test de régression test_backwards_drawn_rectangle dans roi_coords_unit_test.py

  • ROI de grille - Paramètres d’espacement manquants pour les grilles non uniformes : Correction de l’extraction ROI de grille pour prendre en charge un espacement des caractéristiques non uniforme

    • L’extraction ROI de grille supposait auparavant des caractéristiques uniformément réparties (espacement = largeur/nx), ce qui échouait pour les images où les caractéristiques ne remplissent pas toute la zone de la grille

    • Exemple : laser_spot_array_raw.png a des points laser espacés d’environ 300 pixels, mais la grille était définie sur 3100×3100 pixels, ce qui a causé un placement incorrect des ROI

    • Ajout des paramètres de pourcentage xstep et ystep (1-200 %, par défaut 100 %) à ROIGridParam pour spécifier l’espacement entre les centres des ROI

    • Mise à jour de la fonction generate_image_grid_roi() pour utiliser un calcul d’étape séparé : dx_step = dx_cell * p.xstep / 100.0

    • Le calcul de la position utilise désormais : x0 = src.x0 + (ic + 0.5) * dx_step + xtrans - 0.5 * dx (préservant la compatibilité ascendante)

    • Les valeurs par défaut (100 %) maintiennent le comportement original exact pour les flux de travail existants

    • Cela permet un placement précis des ROI pour les grilles avec des espaces (par exemple, les tableaux de points laser, les tableaux d’échantillons) en ajustant l’espacement indépendamment de la taille des ROI

  • Formatage du titre du résultat du signal : Correction du suffixe en double dans les titres des résultats pour les fonctions image-vers-signal

    • Lors du calcul du profil radial ou d’autres opérations utilisant new_signal_result, le suffixe (par exemple, les coordonnées du centre) apparaissait deux fois dans le titre

    • Exemple : radial_profile(i019)|center=(192.500, 192.500)|center=(192.500, 192.500) au lieu de radial_profile(i019)|center=(192.500, 192.500)

    • La fonction new_signal_result dans sigima/proc/base.py ajoutait le suffixe deux fois : une fois via le formateur et une fois explicitement

    • Suppression de l’ajout redondant du suffixe - la méthode format_1_to_1_title du formateur gère déjà correctement le formatage du suffixe

    • Affecte des fonctions telles que radial_profile, histogram et d’autres conversions image-vers-signal

    • Ceci clôture Issue #8 - Suffixe dupliqué dans le titre du résultat lors de l’utilisation de new_signal_result

  • Sérialisation HDF5 avec ROI de détection : Correction de l’échec de sauvegarde de l’espace de travail lorsque les images contiennent des ROI générées par la détection de blobs

    • La sauvegarde de l’espace de travail DataLab au format HDF5 échouait avec NotImplementedError: cannot serialize 'rectangle' of type <enum 'DetectionROIGeometry'>

    • La fonction store_roi_creation_metadata() stockait l’énumération DetectionROIGeometry directement dans les attributs de géométrie

    • Corrigé en stockant la valeur chaîne de caractères de l’énumération au lieu de l’objet énumération lui-même

    • Cela permet une sérialisation HDF5 correcte tout en préservant les informations nécessaires pour que apply_detection_rois() recrée les ROI

    • Ceci clôture Issue #7 - La sérialisation HDF5 échoue pour l’énumération de la géométrie ROI de détection

  • Importation de données numériques CSV : Correction des colonnes numériques interprétées incorrectement comme des valeurs datetime (Issue #6)

    • Lors de l’importation de fichiers CSV avec de grandes valeurs numériques (par exemple, des fréquences en Hz comme 4.884e+06), les données étaient incorrectement converties en horodatages datetime

    • La fonction pd.to_datetime() interprétait les valeurs numériques comme des nanosecondes depuis l’époque Unix, corrompant les données originales

    • Ajout d’une vérification pour ignorer les colonnes avec des types numériques dans la détection de datetime - les vraies colonnes datetime sont chargées comme type chaîne de caractères (object)

    • Les données numériques (fréquences, tensions, etc.) sont désormais correctement préservées lors de l’importation CSV

📚 Documentation :

  • Documentation de l’utilisation des paramètres : Amélioration de la documentation pour les paramètres nécessitant un contexte de signal/image (Issue #5)

    • Ajout d’une documentation complète expliquant le modèle update_from_obj() pour les paramètres tels que ZeroPadding1DParam

    • Clarification que sigima.params est l’emplacement d’importation recommandé pour toutes les classes de paramètres

    • Amélioration de la docstring de la classe ZeroPadding1DParam avec un exemple d’utilisation et une admonition « Important »

    • Ajout d’une nouvelle section dans le module sigima.params répertoriant tous les paramètres nécessitant update_from_obj()

    • Création d’un nouvel exemple doc/examples/features/zero_padding.py démontrant l’initialisation correcte des paramètres

  • Nouvel exemple de grille ROI : Ajout d’un exemple démontrant la fonctionnalité de grille ROI

    • Introduction de l’image de test laser_spot_array.png (grille de points laser 6×6) pour aider à déboguer un problème signalé dans DataLab

    • Création d’un nouvel exemple doc/examples/features/roi_grid.py démontrant la fonction generate_image_grid_roi()

    • L’exemple couvre : le chargement des images, l’extraction des sous-régions, la génération de grilles ROI, la configuration des paramètres de taille/traduction/pas, la compréhension des étiquettes de direction et l’extraction des points individuels

Sigima Version 1.0.3 (03/12/2025)#

🛠️ Correctifs :

  • Validation du type de données du signal : Correction des tableaux entiers qui n’étaient pas automatiquement convertis en float64

    • Les tableaux d’entrée entiers sont désormais automatiquement convertis en float64 au lieu de générer des erreurs

    • La validation est appliquée de manière cohérente à tous les accesseurs de données de signal : set_xydata(), x, y, dx, dy

    • Améliore l’utilisabilité en acceptant les entrées entières (courantes dans les données de test et les valeurs d’étalonnage) tout en maintenant la précision de calcul

    • Lève une exception ValueError claire pour les types de données vraiment invalides avec un message d’erreur utile répertoriant les types valides

  • Étalonnage de l’axe des signaux : Ajout de la fonction replace_x_by_other_y() pour remplacer les coordonnées X d’un signal par les valeurs Y d’un autre signal

    • Répond à un manque de fonctionnalité pour l’étalonnage en longueur d’onde et des cas d’utilisation similaires où les données d’étalonnage sont stockées dans les valeurs Y d’un signal séparé

    • Cette opération était auparavant impossible, même si la fonctionnalité ambiguë du mode X-Y existait et semblait liée à ce cas d’utilisation (mais cette fonctionnalité effectue un rééchantillonnage/interpolation, ce qui n’est pas souhaité ici)

    • La nouvelle fonction utilise directement les tableaux Y des deux signaux sans interpolation, nécessitant que les signaux aient le même nombre de points

    • A partir de deux signaux en entrée : le premier fournit les données Y pour la sortie, le second fournit les données Y qui deviendront les coordonnées X

    • Transfert automatique des métadonnées : étiquette/unité X à partir de l’étiquette/unité Y du second signal, étiquette/unité Y préservée du premier signal

    • Cas d’utilisation typique : étalonnage en longueur d’onde en spectroscopie (combiner les mesures d’absorption avec l’échelle de longueur d’onde)

    • Ceci clôture Issue #4 - Fonctionnalité manquante : Remplacer les coordonnées X par les valeurs Y d’un autre signal pour l’étalonnage

  • Formatage des titres de signaux :

    • Titres de signaux polynomiaux : Correction de la génération des titres de signaux polynomiaux pour afficher une notation mathématique (par exemple, 1+2x-3x²+4x³) au lieu d’une liste de paramètres verbeuse (par exemple, polynomial(a0=1,a1=2,a2=-3,a3=4,a4=0,a5=0))

    • La méthode PolyParam.generate_title() construit désormais des expressions mathématiques appropriées avec une gestion correcte des signes, une simplification des coefficients (par exemple, x au lieu de 1x, -x au lieu de -1x) et une notation des exposants utilisant le symbole ^

    • Améliore la lisibilité dans l’interface graphique de DataLab et les listes de signaux en présentant les polynômes sous une forme mathématique standard

    • Les coefficients nuls sont automatiquement omis de l’expression (par exemple, 1+x+x³ lorsque a2=0)

    • Gère les cas limites, y compris les polynômes tous nuls (renvoie "0"), les termes uniques et les coefficients négatifs

    • Ceci clôture Issue #3 - Les titres des signaux polynomiaux doivent utiliser une notation mathématique au lieu d’une liste de paramètres

  • Extraction de données ROI :

    • Correction de l’erreur ValueError: zero-size array to reduction operation minimum which has no identity lors du calcul des statistiques sur des images avec ROI s’étendant au-delà des limites de la zone de dessin

    • La méthode ImageObj.get_data() limite désormais correctement les boîtes englobantes des ROI aux limites de l’image

    • Lorsqu’une ROI est complètement en dehors des limites de l’image, renvoie un tableau 1x1 entièrement masqué (contenant NaN) pour éviter les erreurs de tableau de taille zéro dans les calculs statistiques

    • Les ROI partiellement superposées sont correctement gérées en limitant les coordonnées aux plages valides de l’image

    • Ce correctif garantit un calcul statistique robuste quel que soit la position de la ROI par rapport aux limites de l’image

    • Ceci clôture Issue #1 - ValueError lors du calcul des statistiques sur ROI s’étendant au-delà des limites de l’image

Sigima Version 1.0.2 (12/11/2025)#

✨ Nouvelles fonctionnalités et améliorations:

  • Nouveaux types d’images paramétriques : Ajout de cinq nouveaux types de génération d’images paramétriques pour les tests et l’étalonnage

    • Motif en damier : Carrés alternés pour l’étalonnage de la caméra et l’analyse de la fréquence spatiale. Les paramètres incluent la taille des carrés, le décalage et les valeurs min/max

    • Réseau sinusoïdal : Test de la réponse en fréquence avec des fréquences spatiales configurables (fx, fy), phase, amplitude et offset DC

    • Motif en anneau : Anneaux circulaires concentriques pour l’analyse radiale. Période, largeur, position centrale et plage d’amplitude configurables

    • Étoile de Siemens : Motif de test de résolution avec des rayons radiaux. Les paramètres incluent le nombre de rayons, le rayon intérieur/extérieur, la position centrale et la plage de valeurs

    • Fonction sinc 2D : Modélisation PSF/diffraction avec la fonction sinus cardinal. Amplitude, centre, facteur d’échelle (sigma) et offset DC configurables

  • Propriété GeometryResult.value : Nouvelle propriété de commodité pour un accès facile aux valeurs géométriques calculées dans les scripts

    • Prend en charge les formes POINT, MARKER et SEGMENT

    • Renvoie un tuple (x, y) pour les formes POINT et MARKER (les deux coordonnées accessibles)

    • Renvoie une longueur float pour les formes SEGMENT (calculée via segments_lengths())

    • Annotation de type de retour : float | tuple[float, float]

    • Fournit une API intuitive : déballer les coordonnées avec x, y = result.value ou obtenir la longueur avec length = result.value

    • Gestion complète des erreurs pour les formes non prises en charge et les résultats à plusieurs lignes

  • Les fonctions d’analyse de signal renvoient GeometryResult : Modification de x_at_y() et y_at_x() pour renvoyer des résultats géométriques pour une meilleure visualisation

    • x_at_y() renvoie désormais GeometryResult avec le type MARKER (au lieu de TableResult)

    • y_at_x() renvoie désormais GeometryResult avec le type MARKER (au lieu de TableResult)

    • Les deux fonctions renvoient les coordonnées sous la forme d’un tableau N×2 pour l’affichage des marqueurs croisés

    • Permet une visualisation correcte des marqueurs dans l’interface graphique de DataLab (affichés comme des marqueurs croisés sur les graphiques)

    • API conviviale pour les scripts : utilisez la propriété .value pour extraire facilement les coordonnées sous forme de tuple (x, y)

    • Exemple : x, y = proxy.compute_x_at_y(params).value fournit un accès direct aux deux coordonnées

    • Changement majeur : Les scripts accédant aux résultats sous forme de tableaux doivent être mis à jour pour utiliser la propriété .value ou le tableau .coords

🛠️ Correctifs :

  • Fonctions de détection :

    • Détection de contours : Suppression du support de création de ROI dans ContourShapeParam, car cela n’a pas de sens pour les cas d’utilisation de détection de contours. La classe ContourShapeParam n’hérite plus de DetectionROIParam, et la fonction contour_shape() n’appelle plus store_roi_creation_metadata(). La création de ROI reste disponible pour d’autres méthodes de détection (détection de blobs, détection de pics 2D) où cela est approprié.

    • Gestion des erreurs de création de ROI : Amélioration de la gestion des erreurs dans la fonction create_image_roi_around_points() pour fournir des messages d’erreur plus clairs :

      • Lève désormais une exception ValueError lorsque la taille de ROI calculée est trop petite (points trop proches les uns des autres)

      • Messages d’erreur améliorés pour aider les utilisateurs à comprendre la cause des échecs

      • Valide le paramètre de géométrie de ROI de manière plus explicite

      • Meilleure gestion des cas limites dans le dimensionnement automatique des ROI

  • API publique :

    • La méthode BaseObj.roi_has_changed a été rendue privée (en la renommant en BaseObj.__roi_has_changed) pour éviter une utilisation externe accidentelle. Cela interférerait avec le mécanisme interne de rafraîchissement des masques qui repose sur un accès contrôlé à cette méthode. La méthode ne fait pas partie de l’API publique et ne doit pas être appelée directement par les applications.

Sigima Version 1.0.1 (05/11/2025)#

✨ Nouvelles fonctionnalités et améliorations:

  • Création de ROI de détection : Mécanisme générique de création de ROI pour toutes les fonctions de détection

    • Nouvelle classe de paramètres DetectionROIParam fournissant des champs de création de ROI standardisés

      • create_rois: Indicateur booléen pour activer/désactiver la création de ROI (par défaut : Faux)

      • roi_geometry: Enum sélectionnant la forme de la ROI (RECTANGLE ou CIRCLE, par défaut : RECTANGLE)

    • Nouvel énuméré DetectionROIGeometry dans sigima.enums avec les options RECTANGLE et CIRCLE

    • Toutes les classes de paramètres de détection héritent désormais de DetectionROIParam :

      • Peak2DDetectionParam: Détection de pics 2D

      • ContourShapeParam: Ajustement de la forme du contour

      • BlobDOGParam, BlobDOHParam, BlobLOGParam, BlobOpenCVParam: Méthodes de détection de blobs

      • HoughCircleParam: Détection de cercles de Hough

    • Nouvelle fonction d’assistance store_roi_creation_metadata() :

      • Stocke l’intention de création de ROI dans le dictionnaire GeometryResult.attrs

      • Appelée dans les fonctions de calcul pour communiquer les préférences de ROI

      • Ne contrevient pas à la pureté de la fonction (pas de modification d’objet)

    • Nouvelle fonction d’assistance apply_detection_rois() :

      • Crée des ROIs sur des objets d’image en fonction des métadonnées GeometryResult.attrs

      • Renvoie True si des ROI ont été créées, False sinon

      • Gère les géométries rectangulaires et circulaires

      • Calcule automatiquement la taille optimale de la ROI en fonction de l’espacement des caractéristiques

      • Peut être appelé par des applications en dehors des fonctions de calcul

    • L’architecture basée sur les métadonnées maintient la séparation des concepts :

      • Les fonctions de calcul restent pures (pas d’effets de bord)

      • Les applications contrôlent quand/comment les ROI sont créées

      • Fonctionne sans problème avec les moteurs de traitement parallèle (par exemple, les processeurs DataLab)

    • Couverture de test complète avec l’assistant validate_detection_rois() dans la suite de tests

  • Injection automatique de func_name pour les objets de résultat

    • Le décorateur @computation_function injecte désormais automatiquement le nom de la fonction dans les objets TableResult et GeometryResult

    • Lorsqu’une fonction de calcul renvoie un objet de résultat avec func_name=None, le décorateur le définit au nom de la fonction en utilisant dataclasses.replace()

    • Garantit l’attribution systématique de func_name pour un suivi et un affichage appropriés des résultats

    • L’implémentation utilise la vérification directe de type isinstance() pour TableResult et GeometryResult

    • S’applique à la fois au wrapper principal du décorateur (avec les paramètres DataSet) et au wrapper de passage simple

    • Élimine le besoin d’attribution manuelle de func_name dans les fonctions de calcul

  • Utilitaire de création de ROI d’image : Nouvelle fonction create_image_roi_around_points() dans sigima.objects.image.roi

    • Crée des ROI rectangulaires ou circulaires autour d’un ensemble de coordonnées de points

    • Calcule automatiquement la taille optimale de la ROI en fonction de la distance minimale entre les points

    • Gère les conditions de bord pour maintenir les ROI dans des coordonnées d’image valides

    • Prend en charge les types de géométrie « rectangle » et « cercle »

    • Conçu pour créer des ROI autour des caractéristiques détectées (pics, blobs, etc.)

    • Centralise la logique de création de ROI précédemment dupliquée dans les applications

  • API d’annotations : Nouvelle API publique pour la gestion des annotations sur les objets Signal et Image

    • Ajout de la méthode get_annotations() : Renvoie une liste d’annotations au format JSON versionné

    • Ajout de la méthode set_annotations(annotations) : Définit les annotations à partir d’une liste (remplace les annotations existantes)

    • Ajout de la méthode add_annotation(annotation) : Ajoute une seule annotation à l’objet

    • Ajout de la méthode clear_annotations() : Supprime toutes les annotations de l’objet

    • Ajout de la méthode has_annotations() : Renvoie True si l’objet a des annotations

    • Les annotations sont stockées dans les métadonnées de l’objet avec un support de versionnage (actuellement version « 1.0 »)

    • Chaque annotation est un dictionnaire avec des clés telles que type, item_class et item_json (par exemple)

    • Fournit une séparation claire entre le stockage générique des annotations et les détails spécifiques à la visualisation

    • Permet aux applications de gérer les annotations de tracé (formes, étiquettes, etc.) indépendamment des ROI

    • Entièrement compatible avec le modèle d’adaptateur PlotPy de DataLab pour la visualisation

🛠️ Correctifs :

  • Détection de pics 2D : Correction d’une violation architecturale dans la fonction de calcul peak_detection()

    • Suppression de la création directe de ROI dans la fonction de calcul (modifiait les objets d’entrée)

    • Les fonctions de calcul décorées avec @computation_function() doivent être pures (pas d’effets de bord)

    • Suppression de la ligne 128 : obj.roi = create_image_roi(...) qui contrevenait à ce principe

    • La création de ROI est désormais gérée par les applications dans leur couche de présentation

    • DataLab utilise la nouvelle utilité create_image_roi_around_points() à cet effet

    • Maintient la séparation des concepts : Sigima calcule les résultats, les applications créent des représentations visuelles

    • Corrige la régression où les ROI n’apparaissaient pas dans le flux de travail basé sur les processeurs de DataLab

  • Classes de paramètres : Suppression des titres par défaut des classes génériques OrdinateParam et AbscissaParam

    • Ces classes de paramètres sont réutilisées dans plusieurs fonctions de calcul (par exemple, full_width_at_y, x_at_y)

    • Des titres par défaut comme « Ordinate » créaient une redondance lorsqu’ils étaient affichés avec les noms de fonction dans les résultats d’analyse.

    • Les titres sont désormais vides par défaut, permettant aux applications de fournir des titres spécifiques au contexte si nécessaire.

    • Améliore la clarté lorsque la même classe de paramètres est utilisée par différentes fonctions.

  • Représentation HTML des résultats : amélioration du contraste des couleurs pour le mode sombre

    • Changement de la couleur du titre des résultats dans les méthodes to_html() de bleu standard (#0000FF) à une teinte plus claire (#5294e2)

    • Affecte la sortie HTML de TableResult et GeometryResult

    • Offre une meilleure visibilité en mode sombre tout en maintenant une bonne apparence en mode clair

    • Améliore la lisibilité lorsque les résultats sont affichés dans des applications avec des thèmes sombres

  • Correction de l’extraction des caractéristiques des impulsions avec des signaux ROI. Lors de l’extraction des caractéristiques des impulsions à partir de signaux avec des ROI, les paramètres de plage de début/fin (qui s’appliquent au signal complet) étaient utilisés sur les données extraites des ROI, ce qui entraînait des résultats incorrects. Désormais, extract_pulse_features() détecte lorsque les plages de paramètres sont en dehors de la plage x de la ROI et passe automatiquement en mode de détection automatique. De plus, extract_pulse_features() dans sigima.tools.signal.pulse initialise désormais correctement les plages None en utilisant get_start_range() et get_end_range() avec le paramètre fraction. Cela garantit que les caractéristiques des impulsions extraites d’un signal avec des ROI correspondent aux caractéristiques extraites des signaux ROI extraits individuellement.

  • Correction de l’extraction des ROI pour les signaux : les ROI ne sont plus copiées vers les signaux de destination lors de l’extraction des ROI. Lors de l’utilisation de extract_roi() ou extract_rois(), les signaux extraits n’ont désormais aucune ROI définie, ce qui est le comportement attendu puisque les données extraites représentent déjà la ROI elle-même. Cela corrige le problème où les signaux extraits hériterait des définitions de ROI du signal source.

  • Correction de l’extraction des caractéristiques des impulsions pour qu’elle soit exclusive aux ROI lorsque des ROI sont définies. Auparavant, TableKind.PULSE_FEATURES calculait incorrectement les résultats à la fois pour l’objet entier et pour chaque ROI. Cela n’avait pas de sens pour l’analyse des impulsions, où la définition des ROI indique la présence de plusieurs impulsions, rendant les caractéristiques de l’objet entier non pertinentes. Désormais, PULSE_FEATURES calcule correctement uniquement sur les ROI lorsqu’elles existent, sinon sur l’objet entier. TableKind.STATISTICS et TableKind.CUSTOM conservent le comportement attendu (objet entier + ROI).

  • Correction de ValueError dans choose_savgol_window_auto() lors du traitement de petits tableaux de données (par exemple, des segments ROI). La fonction contraint désormais correctement la longueur de la fenêtre Savitzky-Golay à être strictement inférieure à la taille du tableau, comme l’exige l’option mode='interp' de scipy. Cela corrige le problème lors de l’extraction des caractéristiques des impulsions à partir de petits segments ROI dans les signaux.

  • Modification de RadialProfileParam pour permettre l’initialisation de l’ensemble de données même lorsque l’objet image associé n’est pas encore défini (appel à update_from_obj). Cela est utile lors de la création de l’objet paramètre avant d’assigner l’image, permettant des flux de travail plus flexibles.

  • Suppression de la fonction inutilisée signals_to_array() du module sigima.proc.signal.arithmetic. Cette fonction n’était utilisée nulle part dans la base de code et a été remplacée par une construction directe de tableau NumPy dans les fonctions __signals_y_to_array() et __signals_dy_to_array(), pour un usage interne uniquement.

  • Méthodes de définition des coordonnées ROI : Correction des bogues dans les méthodes set_physical_coords() et set_indices_coords()

    • Correction de RectangularROI.set_physical_coords() : Maintenant, les coordonnées sont correctement stockées au format delta [x0, y0, dx, dy] au lieu du format coin [x0, y0, x1, y1] lorsque indices=True

    • Correction de BaseSingleROI.set_indices_coords() : Maintenant, le paramètre d’entrée coords est correctement converti au lieu de self.coords lorsque indices=False

    • Ces méthodes ont été implémentées pour compléter l’API mais n’ont pas été utilisées dans la base de code Sigima/DataLab

    • Ajout de tests unitaires complets couvrant tous les types de ROI (rectangulaire, circulaire, polygonal) et les cas limites

Sigima Version 1.0.0 (28/10/2025)#

✨ Nouvelles fonctionnalités et améliorations:

  • Conversion de signaux en image : Nouvelle fonctionnalité pour combiner plusieurs signaux en une image 2D

    • Nouvelle fonction de calcul signals_to_image() dans sigima.proc.signal.arithmetic

    • Prend une liste de signaux et les combine en une image en empilant des tableaux Y

    • Deux modes d’orientation :

      • Lignes : Chaque signal devient une ligne dans l’image (par défaut)

      • Colonnes : Chaque signal devient une colonne dans l’image

    • Normalisation facultative :

      • Prend en charge plusieurs méthodes de normalisation (Z-score, Min-Max, Maximum)

      • Normalise chaque signal indépendamment avant l’empilement

      • Utile pour visualiser des signaux avec différentes plages d’amplitude

    • Valide que tous les signaux ont la même taille avant de les combiner

    • Nouvelle classe de paramètres SignalsToImageParam avec des paramètres d’orientation et de normalisation

    • Nouvel énuméré SignalsToImageOrientation pour spécifier l’orientation des lignes/colonnes

    • Tests de validation complets pour toutes les combinaisons de paramètres

    • Idéal pour créer des spectrogrammes, des cartes thermiques ou des affichages en cascade à partir de collections de signaux

  • Prise en charge des coordonnées non uniformes pour les images : Ajout d’une prise en charge complète des coordonnées de pixels non uniformes

    • ImageObj prend désormais en charge les systèmes de coordonnées uniformes et non uniformes :

      • Coordonnées uniformes : définies par l’origine (x0, y0) et l’espacement des pixels (dx, dy)

      • Coordonnées non uniformes : définies par des tableaux de coordonnées (xcoords, ycoords)

    • Nouvelles méthodes pour la manipulation des coordonnées :

      • set_coords(): Définir les tableaux de coordonnées X et Y non uniformes

      • is_uniform_coords: Propriété pour vérifier si les coordonnées sont uniformes

    • set_uniform_coords(): Nouvelle fonction de calcul pour convertir les coordonnées non uniformes en coordonnées uniformes

      • Extrait automatiquement l’espacement uniforme des tableaux non uniformes

      • Gère les problèmes de précision numérique des tableaux générés par linspace

      • Préserve les données d’image lors de la transformation du système de coordonnées

    • Amélioration de la fonction calibration() avec prise en charge des polynômes :

      • Prend désormais en charge l’étalonnage polynomial jusqu’à l’ordre cubique : dst = a0 + a1*src + a2*src² + a3*src³

      • La classe de paramètres est passée de a, b (linéaire) à a0, a1, a2, a3 (polynomiale)

      • Fonctionne sur l’axe X, l’axe Y (création de coordonnées non uniformes) et l’axe Z (valeurs de données)

      • L’étalonnage linéaire est un cas particulier avec a2=0, a3=0

      • Gère automatiquement la conversion entre les systèmes de coordonnées uniformes et non uniformes

    • Support I/O amélioré :

      • Le format HDF5 prend désormais en charge la sérialisation/désérialisation des coordonnées non uniformes

      • Les fichiers texte coordonnés prennent en charge les tableaux de coordonnées non uniformes

    • Toutes les opérations géométriques ont été mises à jour pour gérer les deux types de coordonnées :

      • Les transformations de coordonnées préservent ou créent un système de coordonnées approprié

      • Les opérations ROI fonctionnent sans problème avec des coordonnées uniformes et non uniformes

  • Prise en charge des DateTime pour les données de signal : Ajout d’une gestion complète des DateTime pour les données de l’axe X du signal

    • Détection et conversion automatiques des colonnes datetime lors de la lecture des fichiers CSV

      • Détecte les valeurs datetime dans la première ou la deuxième colonne (gestion des colonnes d’index)

      • Valide le format datetime et garantit des plages de dates raisonnables (post-1900)

      • Convertit les chaînes datetime en timestamps flottants pour un calcul efficace

      • Préserve les métadonnées datetime pour un affichage et une exportation appropriés

    • Nouvelles méthodes SignalObj pour la manipulation des datetime :

      • set_x_from_datetime(): Convertit les objets/chaînes datetime en données X de signal avec des unités de temps configurables (s, ms, μs, ns, min, h)

      • get_x_as_datetime(): Récupère les valeurs X sous forme d’objets datetime pour l’affichage ou l’exportation

      • is_x_datetime(): Vérifie si le signal contient des données datetime

    • Export CSV amélioré pour préserver le format datetime lors de l’écriture de signaux avec un axe X datetime

    • Nouveau module de constantes (sigima.objects.signal.constants) définissant les clés de métadonnées datetime et les facteurs de conversion des unités de temps

    • Tests unitaires complets couvrant la conversion datetime, le roundtrip I/O et les cas limites

    • Fichier de données de test exemple avec des données de logger de température/humidité du monde réel (datetime.txt)

  • Nouveau sous-paquet client : Fonctionnalité client DataLab migrée vers sigima.client

    • Ajout de sigima.client.remote.SimpleRemoteProxy pour la communication XML-RPC avec DataLab

    • Ajout de sigima.client.base.SimpleBaseProxy en tant que classe de base abstraite pour les proxys DataLab

    • Ajout de tests unitaires complets et de documentation API

    • Maintient le principe de conception sans interface graphique (composants GUI exclus)

    • Permet le contrôle à distance de l’application DataLab depuis des scripts Python et des notebooks Jupyter

    • La fonctionnalité client est désormais directement accessible : from sigima import SimpleRemoteProxy

  • Nouvelle fonctionnalité de ROI d’image : Ajout de la fonctionnalité ROI inverse pour les ROIs d’image

    • Ajout du paramètre inside à la classe de base BaseSingleImageROI, héritée par tous les types de ROI d’image (PolygonalROI, RectangularROI, CircularROI)

    • Lorsque inside=True, le ROI représente la région à l’intérieur de la forme (comportement inversé)

    • Lorsque inside=False (par défaut), le ROI représente la région à l’extérieur de la forme (comportement original)

    • Entièrement intégré à la sérialisation (to_dict/from_dict) et à la conversion de paramètres (to_param/from_param)

    • Les ROIs de signal (SegmentROI) ne sont pas affectées car le concept ne s’applique pas aux intervalles 1D.

    • Architecture optimale sans duplication de code - toute la fonctionnalité inside est implémentée une seule fois dans la classe de base.

    • Les classes ROI individuelles n’ont plus besoin de constructeurs personnalisés, héritant directement de la classe de base.

  • Nouvelle opération d’image :

    • Convolution.

  • Nouveau support de format d’image :

    • Fichiers image texte avec coordonnées : Ajout de la prise en charge de la lecture des fichiers texte coordonnés (extension .txt), similaires au format d’image Matris.

      • Prend en charge à la fois les données d’image réelles et à valeurs complexes avec des images d’erreur facultatives.

      • Gère automatiquement les valeurs NaN dans les données.

      • Lit les métadonnées, y compris les unités (X, Y, Z) et les étiquettes, à partir des en-têtes de fichiers.

  • Nouvelles fonctionnalités d’analyse de l’image :

    • Projections horizontale et verticale

      • Calcule le profil de projection horizontale en sommant les valeurs le long de l’axe y (sigima.proc.image.measurement.horizontal_projection).

      • Calcule le profil de projection verticale en sommant les valeurs le long de l’axe x (sigima.proc.image.measurement.vertical_projection).

  • Nouveaux algorithmes de courbe d’ajustement: Cadre complet d’ajustement de courbe avec le module sigima.tools.signal.fitting :

    • Fonctions d’ajustement de base: Ensemble complet d’algorithmes d’ajustement de courbe pour l’analyse de données scientifiques :

      • linear_fit: Ajustement de régression linéaire

      • polynomial_fit: Ajustement polynomial avec degré configurable

      • gaussian_fit: Ajustement de profil gaussien pour l’analyse de pics

      • lorentzian_fit: Ajustement de profil lorentzien pour la spectroscopie

      • voigt_fit: Ajustement de profil Voigt (convolution des profils gaussien et lorentzien)

      • exponential_fit: Ajustement exponentiel simple avec protection contre les débordements

      • piecewiseexponential_fit: Ajustement exponentiel par morceaux (croissante-décroissante) avec estimation avancée des paramètres

      • planckian_fit: Ajustement planckien (radiation du corps noir) avec mise en œuvre physique correcte

      • twohalfgaussian_fit: Ajustement de pic asymétrique avec des paramètres gauche/droite séparés

      • multilorentzian_fit: Ajustement Lorentzien multi-pic pour des spectres complexes

      • sinusoidal_fit: Ajustement sinusoïdal avec estimation de fréquence basée sur FFT

      • cdf_fit: Ajustement de la fonction de distribution cumulative utilisant la fonction d’erreur

      • sigmoid_fit: Ajustement de la fonction sigmoïde (logistique) pour les courbes en S

    • Ajustement exponentiel par morceaux (croissante-décroissante) avancé: Algorithme amélioré avec :

      • Modèle standard exponentiel par morceaux : y = a_left*exp(b_left*x) + a_right*exp(b_right*x) + y0

      • Stratégie d’optimisation multi-démarrage pour une convergence robuste vers le minimum global

      • Prise en charge des taux exponentiels positifs et négatifs (composantes de croissance et de décroissance)

      • Validation complète des limites des paramètres pour éviter les erreurs d’optimisation

    • Ajustement de pic asymétrique amélioré: twohalfgaussian_fit avancé avec :

      • Offsets de base séparés pour les côtés gauche et droit (y0_left, y0_right)

      • Paramètres d’amplitude indépendants (amp_left, amp_right) pour un meilleur modélisation asymétrique

      • Estimation robuste de la ligne de base utilisant des méthodes basées sur les percentiles

    • Fonctionnalités techniques: Toutes les fonctions d’ajustement incluent :

      • Estimation automatique des paramètres initiaux à partir des caractéristiques des données

      • Application correcte des limites garantissant la stabilité de l’optimisation

      • Gestion complète des erreurs et validation des paramètres

      • Structures de paramètres basées sur des classes de données cohérentes

      • Couverture de test complète avec validation des données synthétiques et expérimentales

  • Nouvelles fonctionnalités communes signal/image :

    • Ajout de la fonctionnalité phase (argument) pour extraire les informations de phase des signaux ou des images complexes.

    • Ajout de l’opération pour créer un signal/image à valeurs complexes à partir des parties réelle et imaginaire.

    • Ajout de l’opération pour créer un signal/image à valeurs complexes à partir de l’amplitude et de la phase.

    • Écart-type des signaux ou images de la sélection (ceci complète la fonctionnalité « Moyenne »).

    • Générer un nouveau signal ou une nouvelle image : bruit de Poisson.

    • Ajouter du bruit aux signaux ou images sélectionnés.

      • Du bruit gaussien, de Poisson ou uniforme peut être ajouté.

    • Nouvelles fonctions utilitaires pour générer des noms de fichiers.

    • Déconvolution dans le domaine fréquentiel.

  • Nouvelles fonctionnalités de ROI:

    • Amélioration de la gestion du titre de la ROI unique, en utilisant un titre par défaut basé sur l’index de la ROI lorsque aucun titre n’est fourni.

    • Ajout de la méthode combine_with aux objets ROI (SignalROI et ImageROI) pour renvoyer un nouvel ROI qui combine le ROI actuel avec un autre (union) et gère les ROIs en double.

    • Transformations de ROI d’image:

      • Avant ce changement, les ROI d’image étaient supprimées après l’application de chaque fonction de calcul unique.

      • Maintenant, les fonctions de calcul géométrique préservent les informations de ROI à travers les transformations: les ROIs transformées sont automatiquement mises à jour dans l’objet image.

    • Coordonnées de ROI d’image:

      • Avant ce changement, les coordonnées de ROI d’image étaient définies par défaut à l’aide d’indices.

      • Maintenant, ROI2DParam utilise des coordonnées physiques par défaut.

      • Les ROI peuvent toujours être définies à l’aide d’indices (en utilisant la fonction create_image_roi).

    • Grille de ROI d’image:

      • Nouvelle fonction generate_image_grid_roi: crée une grille de ROIs à partir d’une image, avec des paramètres personnalisables pour la taille de la grille, l’espacement et la nomination.

      • Cette fonction permet d’extraire facilement plusieurs ROIs d’une image de manière structurée.

      • Les paramètres sont gérés via la classe ROIGridParam, qui fournit un moyen pratique de spécifier les propriétés de la grille:

        • nx / ny: Nombre de cellules de grille dans la direction X/Y.

        • xsize / ysize: Taille de chaque cellule de grille en pixels.

        • xtranslation / ytranslation: Translation de la grille en pixels.

        • xdirection / ydirection: Direction de la grille (croissante/décroissante).

  • Nouvelles fonctionnalités de traitement d’image:

    • Nouvelle fonctionnalité de « Rééchantillonnage 2D » :

      • Cette fonctionnalité permet de rééchantillonner des images 2D vers une nouvelle grille de coordonnées à l’aide d’une interpolation.

      • Elle prend en charge deux modes de rééchantillonnage : la taille des pixels et la forme de sortie.

      • Plusieurs méthodes d’interpolation sont disponibles : linéaire, cubique et plus proche voisin.

      • Le paramètre fill_value contrôle la manière dont les pixels hors limites sont gérés, avec prise en charge des valeurs numériques ou de NaN.

      • La conversion automatique du type de données garantit une gestion appropriée des NaN pour les images entières.

      • Elle est implémentée dans la fonction sigima.proc.image.resampling avec des paramètres définis dans Resampling2DParam.

    • Nouvelle fonctionnalité de « Filtre fréquentiel gaussien » :

      • Cette fonctionnalité permet de filtrer une image dans le domaine fréquentiel à l’aide d’un filtre gaussien.

      • Elle est implémentée dans la fonction sigima.proc.image.frequency_domain_gaussian_filter.

    • Nouvelle fonctionnalité « Gommage »:

      • Cette fonctionnalité permet de gommer une zone de l’image en utilisant la valeur moyenne de l’image.

      • Elle est implémentée dans la fonction sigima.proc.image.erase.

      • La zone gommée est définie par un paramètre de région d’intérêt (ROI).

      • Exemple d’utilisation:

        import numpy as np
        import sigima.objects as sio
        import sigima.proc.image as sipi
        
        obj = sio.create_image("test_image", data=np.random.rand(1024, 1024))
        p = sio.ROI2DParam.create(x0=600, y0=800, width=300, height=200)
        dst = sipi.erase(obj, p)
        
    • Par défaut, le regroupement de pixels modifie la taille des pixels.

    • Amélioration de l’estimation du centroïde:

      • La nouvelle méthode get_centroid_auto implémente une stratégie adaptative qui choisit entre le centroïde basé sur Fourier et un repli plus robuste (scikit-image), en fonction de l’accord avec une référence basée sur le profil projeté.

      • Introduction de la fonction get_projected_profile_centroid pour une estimation robuste via des projections 1D (médiane ou barycentrique), offrant une grande précision même avec des images tronquées ou bruyantes.

      • Ces changements améliorent la précision et la stabilité du centroïde dans les cas extrêmes (par exemple, disques tronqués ou taches décentrées), tout en préservant la robustesse au bruit.

      • Voir l”issue DataLab #251 pour plus de détails.

  • Nouvelles fonctionnalités de traitement du signal:

    • Nouvelle fonctionnalité de « Filtre fréquentiel idéal » :

      • Cette fonctionnalité permet de filtrer un signal dans le domaine fréquentiel à l’aide d’un filtre idéal.

      • Elle est implémentée dans la fonction sigima.proc.signal.frequency_filter, parmi les autres fonctionnalités de filtrage dans le domaine fréquentiel (Bessel, Butterworth, etc.).

    • Amélioration du remplissage de zéros pour prendre en charge l’ajout au début et à la fin. Changement de la stratégie par défaut vers la prochaine puissance de 2.

    • Algorithmes d’analyse des impulsions: Cadre complet d’extraction des caractéristiques des impulsions dans le module sigima.tools.signal.pulse :

      • Fonctions d’analyse des impulsions de base: Ensemble complet d’algorithmes pour la caractérisation des impulsions en escalier et carrées :

        • extract_pulse_features: Fonction principale pour l’extraction automatisée des caractéristiques des impulsions

        • heuristically_recognize_shape: Détection intelligente du type de signal (escalier, carré ou autre)

        • detect_polarity: Détection robuste de la polarité utilisant l’analyse de la ligne de base

      • Extraction avancée des paramètres temporels: Algorithmes de mesure précis pour :

        • Calculs du temps de montée et de descente avec des rapports de début/fin configurables (par exemple, 10%-90%)

        • Paramètres temporels à des fractions spécifiques (x10, x50, x90, x100) de l’amplitude du signal

        • Calcul de la largeur à mi-hauteur (FWHM) pour les impulsions carrées

        • Mesure de la durée de l’impulsion pour la caractérisation des impulsions

      • Capacités d’analyse de la ligne de base: Méthodes statistiques pour :

        • Détection automatique de la plage de ligne de base à partir des extrêmes du signal

        • Estimation robuste du niveau de la ligne de base en utilisant les valeurs moyennes dans les plages

        • Caractérisation de la ligne de base de début et de fin pour l’analyse différentielle

      • Validation des signaux et gestion des erreurs: Validation des entrées complète avec :

        • Vérifications de la cohérence des tableaux de données et détection des NaN/infinis

        • Validation de la longueur du signal et vérification des limites de plage

        • Gestion des erreurs élégante avec des messages d’exception descriptifs

      • Dataclass PulseFeatures: Conteneur de résultats structuré avec tous les paramètres extraits :

        • Mesures d’amplitude, de polarité et de décalage

        • Paramètres temporels (rise_time, fall_time, fwhm, x10, x50, x90, x100)

        • Plages de ligne de base (xstartmin, xstartmax, xendmin, xendmax)

        • Classification de la forme du signal et durée de l’impulsion

      • L’implémentation s’appuie sur des méthodes statistiques robustes et fournit à la fois des fonctions de commodité de haut niveau et des blocs de construction de bas niveau pour des flux de travail d’analyse d’impulsions personnalisés.

    • Mise en œuvre complète de la propagation des incertitudes :

      • Ajout de la propagation des incertitudes mathématiquement correcte à ~15 fonctions de traitement du signal de base.

      • Amélioration de la classe Wrap1to1Func pour gérer la propagation des incertitudes pour les fonctions mathématiques (sqrt, log10, exp, clip, absolute, real, imag).

      • Mise en œuvre de la propagation des incertitudes pour les opérations arithmétiques (product_constant, division_constant).

      • Ajout de la propagation des incertitudes pour les fonctions de traitement avancées (power, normalize, derivative, integral, calibration).

      • Toutes les implémentations utilisent des formules de propagation des erreurs appropriées avec une gestion de la stabilité numérique (protection contre les NaN/l’infini).

      • Optimisé pour l’efficacité mémoire en tirant parti de la copie automatique des incertitudes dst_1_to_1 et des modifications sur place.

      • Maintient la compatibilité avec les flux de travail de traitement du signal existants.

  • Nouveau générateur d’image de rampe 2D:

    • Cette fonctionnalité permet de générer une image de rampe 2D: z = a(x − x₀) + b(y − y₀) + c

    • Elle est implémentée dans la classe de paramètres sigima.objects.Ramp2DParam.

    • Exemple d’utilisation:

      import sigima.objects as sio
      param = sio.Ramp2DParam.create(width=100, height=100, a=1.0, b=2.0)
      image = sio.create_image_from_param(param)
      
  • Nouveaux générateurs de signaux: chirp linéaire, fonction logistique, fonction de Planck.

  • Nouveaux paramètres calculés d“« Étendue » de l’image :

    • Ajout de paramètres calculés pour l’étendue de l’image : xmin, xmax, ymin et ymax.

    • Ces paramètres sont automatiquement calculés en fonction de l’origine de l’image, de l’espacement des pixels et des dimensions.

    • Ils fournissent les limites des coordonnées physiques de l’image pour une analyse spatiale améliorée.

  • Nouvelles fonctionnalités d’E/S:

    • Ajout du format HDF5 pour les objets de signal et d’image (extensions .h5sig et .h5ima) qui peuvent être ouverts avec n’importe quel visualiseur HDF5.

    • Ajout de la prise en charge du format de fichier de spectre MCA (Analyseur Multi-Canaux) :

      • Lecture des fichiers MCA (extension .mca) couramment utilisés en spectroscopie et en détection de radiation

      • Extraction automatique des données de spectre et des informations de calibration

      • Prise en charge de la calibration d’énergie avec interpolation pour des valeurs précises de l’axe X

      • Analyse des métadonnées à partir de plusieurs sections (PMCA SPECTRUM, DPP STATUS, CALIBRATION)

      • Prise en charge de divers formats d’encodage (UTF-8, Latin-1, CP1252) pour une compatibilité maximale

    • Ajout de la prise en charge du format de signal et d’image FT-Lab.

    • Ajout de fonctions pour lire et écrire des métadonnées et des ROIs au format JSON:

      • sigima.io.read_metadata et sigima.io.write_metadata pour les métadonnées.

      • sigima.io.read_roi et sigima.io.write_roi pour les ROIs.

    • Ajout de fonctions d’E/S de commodité write_signals et write_images avec prise en charge de SaveToDirectoryParam:

      • Ces fonctions permettent d’enregistrer par lots plusieurs objets de signal ou d’image dans un répertoire avec des modèles de nommage configurables.

      • SaveToDirectoryParam fournit un contrôle sur les noms de fichiers de base (avec prise en charge des chaînes de format Python), des extensions, des chemins de répertoire et du comportement d’écrasement.

      • La résolution automatique des conflits de noms de fichiers garantit des noms de fichiers uniques en cas de doublons.

      • Efficacité améliorée du flux de travail pour le traitement et l’enregistrement de plusieurs objets dans des opérations par lots.

✨ Mise à jour de l’architecture de base: types de résultats scalaires

  • Introduction de deux nouveaux types de résultats immuables: TableResult et GeometryResult, remplaçant les anciens objets ResultProperties et ResultShape.

    • Ces nouveaux types de résultats sont orientés vers le calcul et dépourvus de logique spécifique à l’application (par exemple, Qt, métadonnées), permettant une meilleure séparation des préoccupations et une réutilisation future.

    • Ajout d’un utilitaire TableResultBuilder pour définir progressivement des calculs tabulaires (par exemple, des statistiques sur les signaux ou les images) et générer un objet TableResult.

    • Tous les comportements liés aux métadonnées des anciens types de résultats ont été migrés vers la couche d’application DataLab.

    • Suppression de fonctionnalités obsolètes ou étroitement couplées telles que from_metadata_entry() et transform_shapes() du cœur de Sigima.

  • Cette refonte améliore considérablement la modularité, la testabilité et la clarté de l’API de calcul scalaire.

🛠️ Correctifs :

  • Correction de la gestion des données dans les objets de signal (SignalObj):

    • Les données du signal sont stockées en interne sous la forme d’un tableau 2D de forme (2, n), où la première ligne est les données x et la deuxième ligne est les données y : c’est l’attribut xydata.

    • En raison de cela, lors du stockage de données Y complexes, le type de données est propagé aux données x, ce qui n’est pas toujours souhaité.

    • En guise de solution de contournement, la propriété x renvoie désormais la partie réelle des données x.

    • De plus, la méthode get_data renvoie désormais un tuple de tableaux numpy au lieu d’un seul tableau, permettant d’accéder séparément aux données x et y, tout en conservant le type de données d’origine.

  • Correction de la conversion des coordonnées physiques et des indices de ROI:

    • La conversion entre les coordonnées physiques et les indices a été corrigée (l’erreur de demi-pixel a été supprimée).

    • La méthode indices_to_physical et physical_to_indices lèvent désormais une ValueError si l’entrée ne contient pas un nombre pair d’éléments (paires x, y).

🔒 Corrections de sécurité:

  • Correction de vulnérabilité de dépendance: Correction de la vulnérabilité CVE-2023-4863 dans opencv-python-headless

    • Mise à jour de l’exigence minimale de 4.5.4.60 à 4.8.1.78

    • Correction de la vulnérabilité des binaires libwebp dans les paquets Wheel OpenCV

    • Voir l”avis de sécurité DataLab pour plus de détails.