MACROS D’APHELION. Aphelion 3.2
Vous trouverez ci-dessous de brèves informations sur Aphelion 3.2 Logiciel de traitement d'image. Ce guide vous introduit à l'installation, au chargement/sauvegarde d'images, à la visualisation (histogramme, profil), à l'exécution d'opérateurs, au traitement d'image (filtres, etc.), à l'extraction/analyse d'objets (mesures globales/individuelles), aux rapports d'analyse et à l'édition de macros.
APHELION 3.2 - Manuel d’installation & Didacticiel
11. MACROS D’APHELION
Les macros suivantes sont fournies dans la version standard de développement d’Aphelion. Nous vous recommandons d’exécuter chacune d’entre elles et de regarder leurs résultats. Des parties de celles-ci pourront être utilisées pour vos propres applications. Le paragraphe suivant décrit et commente en détail l’une de ces macros, à savoir Ceramic.apm.
11.1 Macros d’application
Les macros d’application sont situées dans le répertoire \Aphelion\Macros. Pour charger une macro d'application, cliquez sur le bouton Macros dans la barre d'objets, puis sélectionnez l'entrée Macros. Sélectionnez alors dans la liste la macro que vous souhaitez charger.
Nom des Macros
Aphelion.apm
Fonctionnalités présentées dans les macros
Cette macro présente de nouvelles fonctionnalités.
Remarque : la macro nommée Aphelion.apm se trouvant dans le dossier Macros est automatiquement exécutée au démarrage d’Aphelion
Blood.apm
Ceramic.apm
Circuit.apm
Color.apm
Confocal.apm
DemoDialog.apm
DemoLoop.apm
BasicScript telles boîtes de dialogue et contrôle des fenêtres
Segmentation basique, création d’ensemble d’objets et mesure
Traitement d’images de base et techniques de gestion ISR (ensemble d’objets)
Opérateurs morphologiques pour détecter un défaut
Traitement d’image couleur
Conversion RVB en TSI
Affichage d’une boîte de dialogue permanente pour exécuter une application
Boucle sur toutes les images d'un répertoire auxquelles sont appliqués plusieurs opérateurs
41
APHELION 3.2 - Manuel d’installation & Didacticiel
FeretAccess.apm
Fourier.apm
Granulo.apm
Grille.apm
ImgRegister.apm
ImmunoMarker.apm
Road.apm
RoiProcess.apm
SequenceInterface.apm
Calcul et accès aux diamètres de Feret d’un ensemble d’objet ISR
Exemples de filtrage fréquentiel à l’aide de Fourier
Granulométrie morphologique et export vers Excel
Traitement morphologique et mesures ISR
Compare une image à une référence
Utilisation de l'information couleur pour la détection des cellules cancéreuses
Calcul des points de contour, conversion en chaînes puis en segments de droite
Présente la conversion des ensembles d'objets en régions d'intérêt
Dialogue pour l'acquisition de séquence d'images
Zircone.apm Segmentation et analyse d’une image 3D
Remarque : cette macro fonctionne uniquement si les modules de traitement et de visualisation 3D sont sous licence
11.2 Macros d’exemples BasicScript
Les macros d’exemples sont situées dans le répertoire \Aphelion\Examples.
Pour charger une macro d'application, cliquez sur le bouton Macros dans la barre d'objets, puis sélectionnez l'entrée Examples. Sélectionnez alors dans la liste la macro que vous souhaitez charger.
Nom des Macros
3DSlicer
Fonctionnalités présentées dans les macros
Affiche la section 2D sélectionnée parmi l’ensemble des sections d’une image 3D
Remarque : cette macro fonctionne uniquement si le module 3D Image Processing est sous licence fritté de bronze
42
APHELION 3.2 - Manuel d’installation & Didacticiel
ColorImageAccess.apm images d’un répertoire
Accès aux pixels d’une image couleur en
BasicScript
ComplexImageAccess.apm Accès aux pixels d’une image complexe en
BasicScript
Dialog.apm Affiche une boîte de dialogue permanente depuis laquelle peut être lancer une application
EdgeImageAccess.apm Accès aux pixels d’une image de type Edge en
BasicScript
Editor.apm
ExportToExcel.apm
ExportToNotepad.apm
ExportToWord.apm
FileAccess.apm
Présente les commandes BasicScript de contrôle de l’éditeur d’image binaire et d’ensemble d’objets
Démarre Excel et charge un histogramme associé à une image dans une feuille
Démarre le Bloc Note et y charge du texte
Démarre Word et y charge une image et du texte
Montre comment lire et écrire un fichier en Basic
FuzzyClassifier associées aux cartes d'acquisition
Charge une règle de classification (RuleSet), l’applique à l’ensemble d’objets créé et retourne les valeurs de confiance
GlobalMeasurements.apm Calcule un certain nombre de mesures globales
HistogramAccess.apm Accède aux valeurs d'un histogramme depuis
BasicScript
ImageAccess.apm
ImageFlickerView.apm
Lit et écrit les pixels d'une image depuis BasicScript
Affiche successivement 2 images dans la même fenêtre pour les comparer
ImageRefresh.apm
ImgBoxes.apm
Inhibition de l’affichage des images pour accélérer le temps d’exécution de la macro
Transforme des régions en boîtes circonscrites puis les filtre
ImgChains.apm Extrait des chaînes d’une image à teinte de gris
ImgHistogramChart.apm Utilise les fonctions associées au serveur graphique
43
APHELION 3.2 - Manuel d’installation & Didacticiel
ImgLines.apm
ImgRead.apm
ImportFromExcel.apm
LineROI.apm afin de visualiser l’histogramme d'une image
Extrait des lignes dans une image à teinte de gris
Choix d'une image, puis chargement dans la MDI.
Cette macro peut être utilisée comme une sousroutine
Importe les données d’une feuille Excel dans un ensemble d’objets Aphelion
Crée des régions d’intérêt qui sont dérivées d’un ensemble d’objet de type segments de droite mesures
ObjectAccess.apm graphiques
Accède aux attributs des objets ISR depuis Basic
ObjHistogramChart.apm Utilise les fonctions associées au serveur graphique afin d’afficher l'histogramme d'un objet
PrintPage.apm
ProcessDialog.apm
Utilisation des fonctions d'impression depuis Basic
Affiche une boîte de dialogue permanente afin de lancer des opérations sur une image
RegionMorphology.apm Transformations morphologiques appliquées à des régions ISR
RegionRotate.apm Rotation d'objets ISR
ReinitRefresh.apm ajustement
Initialise le rafraîchissement de l’affichage des images (annule DeferRefresh)
ShowImageSequence.apm affichage une séquence d’images 2D
ViewManipulation.apm Gestion de la taille et de la position de fenêtres de la
MDI depuis BasicScript
11.3 Description détaillée d’une Macro : Ceramic.apm
La description détaillée de la macro-commande Ceramic.apm, une des macros standards disponibles sous Aphelion, a pour but :
44
APHELION 3.2 - Manuel d’installation & Didacticiel
• d’extraire toutes les fibres (objets circulaires et sombres),
• de mesurer la surface, l’élongation et la circularité de chaque fibre,
• de fournir les coordonnées en pixels de la position de chaque fibre.
Ceramic.tif est une image de microscopie électronique à balayage. Les valeurs de ses pixels s’étendent de 1 à 255. Dans cette macro, les fibres sont segmentées en utilisant un seuillage des niveaux de gris. Des opérateurs morphologiques sont utilisés pour nettoyer l’image. Une analyse individuelle de fibres est ensuite effectuée. A partir des mesures qui en découlent, les fibres sont filtrées.
Cette macro montre aussi comment utiliser BasicScript, langage interprété compatible
Visual Basic, afin de créer des boîtes de dialogue.
Remarque : dans cet exemple, le code de la macro apparaît dans les boîtes et les annotations en texte normal. Pour de plus amples informations concernant les commandes de BasicScript, référez-vous au Guide de Référence des Macros, disponible depuis le menu Aide d’Aphelion.
Dans BasicScript, tous les commentaires écrits dans une macro doivent être précédés d’une apostrophe. Une autre alternative est d’utiliser la commande rem.
'-----------------------------------------
'* Ceramic.apm *
'-----------------------------------------
'* Originator: GG *
'* Date of creation: 27/01/96 *
'* Date of last modifications: 26/09/96 *
'-----------------------------------------
Toute sous-routine doit avoir un nom. Dans Aphelion, le nom par défaut est main, mais tout autre nom peut lui être attribué. Une sous-routine peut en appeler une autre, en utilisant le concept de librairie de macros.
45
APHELION 3.2 - Manuel d’installation & Didacticiel
Sub main
'-----------------------------------------
Declarations
'-----------------------------------------
'The following declarations define two integer variables breaktime and bt1000.
Dim breaktime As Integer
Dim bt1000 As Integer
La partie de code suivante définit une boîte de dialogue permettant de spécifier la suppression ou non de toutes les images en fin d’exécution. Les valeurs 180 et 48 correspondent à la taille de la boîte de dialogue. La chaîne de caractères "Aphelion
Dialog Box" est le texte qui apparaît dans la bannière de la boîte de dialogue.
Begin Dialog YesNoDialog ,,180,48,"Aphelion Dialog
Box"
Text 4,8,108,8,"Do you want to free all images?",.Text1
End Dialog
La variable ABox est définie comme une boîte de dialogue de type YesNoDialog.
Dim ABox As YesNoDialog
Lorsque cette variable est utilisée dans l’appel de la fonction Dialog, la fenêtre suivante apparaît alors dans Aphelion :
46
APHELION 3.2 - Manuel d’installation & Didacticiel
La déclaration suivante définit une boîte de dialogue pour spécifier le temps de pause.
En fonction du choix de l’utilisateur, les variables OptionButton1, 2 et 3 seront égales
à 0 ou 1. Les autres valeurs numériques correspondent aux tailles et positions des boutons OK et des trois options.
Begin Dialog BreakTimeDialog ,,189,76,"Break Time_
"No break during the execution",.OptionButton1
"messages displayed during 3 sec.",.OptionButton2
"messages displayed during 5 sec.",.OptionButton3
End Dialog
La variable Breakbox est définie comme une boîte de dialogue de type
BreakTimeDialog, définie ci-dessus.
Dim BreakBox As BreakTimeDialog
Cette variable utilisée dans l’appel de la fonction Dialog affiche la fenêtre suivante :
La déclaration ci-dessous définit une boîte de dialogue pour spécifier les filtres qui seront appliqués sur les objets ISR. Toutes les valeurs numériques correspondent aux positions et tailles des boutons et textes.
47
APHELION 3.2 - Manuel d’installation & Didacticiel
Begin Dialog FilterBox,,172,100,"Object Filtering"
"The filtering of the fibers is based on:",_
.Text1,"Arial",9,ebBold
CheckBox 16,36,68,8,"Surface area",.surface
End Dialog
La variable FBox est définie comme une boîte de dialogue de type FilterBox.
Dim FBox As FilterBox
Cette variable utilisée dans l’appel de la fonction Dialog affiche la fenêtre suivante :
Aphelion supporte la 4- et la 8-connexités. Les deux variables suivantes seront utilisées dans l’opération d’étiquetage pour spécifier le nombre de pixels voisins considérés. graph4C = AphNgbGraph("2D 4-connected") graph8C = AphNgbGraph("2D 8-connected")
Après ces déclarations, le programme commence.
'-----------------------------------------
'Main program *
'-----------------------------------------
48
APHELION 3.2 - Manuel d’installation & Didacticiel
En premier lieu, à l’aide de la fonction Dialog et de la variable BreakBox, la boîte de dialogue pour sélectionner le temps de pause entre deux opérations s’affiche. La fonction Dialog retourne -1 si le bouton OK a été cliqué ou 0 si c’est le bouton
CANCEL. Le bouton CANCEL n’étant pas disponible, seule la valeur -1 peut apparaître. Lorsque le bouton OK a été cliqué, la variable BreakBox.OptionGroup1 indique quelle option a été sélectionnée. Cette variable peut prendre les valeurs 0, 1 ou 2. response% = Dialog(BreakBox)
La commande Select Case permet l’exécution conditionnelle de lignes de programme en fonction de la valeur d’une variable. Ceci est particulièrement utile pour le contrôle de la sélection des boutons d’un dialogue.
Select Case response%
Case -1' OK button
If BreakBox.OptionGroup1 = 0 Then breaktime = 0
Else
If BreakBox.OptionGroup1 = 1 Then
Else breaktime = 5
Case 0 ' Cancel button
MsgBox "Cancel button doesn't exist!"
End Select
Dans BasicScript, tous les temps sont définis en millisecondes. Le nombre de secondes spécifié par la variable BreakBox.OptionGroup1 est donc multiplié par
1000. bt1000 = breaktime * 1000
L’image ceramic.tif est chargée depuis le disque dur et une nouvelle image est créée dans Aphelion à l’aide de l’opérateur AphImgNew. Le chemin complet du fichier image doit être spécifié. original = AphImgNew()
AphImgRead original, "c:\Aphelion\Images\Ceramic.tif"
49
APHELION 3.2 - Manuel d’installation & Didacticiel
La commande MsgOpen permet d’afficher une chaîne de caractères dans une boîte de la MDI. La command Sleep génère une pause d’une durée définie (ici, par breaktime). Enfin, à l’aide de la commande MsgClose, vous fermerez la fenêtre de message ouverte par MsgOpen.
MsgOpen "Composite material in a ceramics matrix",_
Sleep bt1000
MsgClose
Les messages qui suivent sont destinés à guider l’utilisateur. Le second message lui recommande de spécifier les seuils 1 et 117 pour le seuillage. En fait, la fonction
AphImgThreshold comporte trois paramètres, les images d’entrée et de sortie et les valeurs de seuils. Comme l’un des paramètres a été omis, l’exécution de la macro sera interrompue afin que l’utilisateur puisse entrer les valeurs non définies (ici, les seuils). Cependant, BasicScript ne permet pas d’omettre le premier paramètre, et les paramètres supprimés de la ligne de commande doivent l’être de la droite vers la gauche obligatoirempent. Si vous désirez rentrer interactivement le premier paramètre, supprimez au moins un paramètre (le dernier) ; la boîte de dialogue opérateur s’ouvrira lors de l’exécution de la commande et vous pourrez alors modifier le premier paramètre interactivement.
MsgOpen "The gray level histogram of this image_
Includes two modes", breaktime, False, False
Sleep bt1000
MsgClose
MsgOpen "A threshold will segment the two phases",_
Sleep bt1000
MsgClose
MsgOpen "Specify Low as 1 and High as 117", 0, False,_
False
Sleep 3000
Les lignes suivantes présentent un seuillage de l’image originale vers une nouvelle image appelée Binary1. Ce nom apparaîtra dans la bannière de la fenêtre et permettra
également à l’utilisateur de rappeler cette image pour d’autres traitements. Comme
50
APHELION 3.2 - Manuel d’installation & Didacticiel
indiqué plus haut, l’argument AphThreshold de AphImgThreshold n’a pas été spécifié afin de rendre le seuillage interactif. b1 = AphImgNew("Binary1")
AphImgThreshold original,b1
MsgClose
MsgOpen "Interactive gray level Thresholding",_
breaktime, False
Sleep bt1000
MsgClose
L’image binaire résultant du seuillage inclut les fibres ainsi que des parties du fond
(pixels les plus sombres). Les fibres étant plus larges que le bruit de fond, une dilatation morphologique de l’image originale (avec un élément structurant de taille supérieure au bruit et inférieure aux fibres) permet de supprimer les pixels les plus sombres.
La commande AphImgDilate appliquera une dilatation en niveaux de gris de taille 3, avec un élément structurant carré, à l’image originale. Le résultat de la transformation est l’image Image1. i1 = AphImgNew("Image1")
AphImgDilate original,i1,AphSElement("Square",3)
Un nouveau seuillage est effectué pour extraire les germes des fibres. Les seuils sont mis à 0 et 117. Le seuillage est exécuté sur l’image dilatée et l’image résultat, ne contenant plus de bruit de fond, est appelée Binary2. b2 = AphImgNew("Binary2")
AphImgThreshold i1,b2,AphThreshold(0,117)
La fonction suivante, AphImgReconstruct, est une reconstruction binaire de la première image binaire (fibres et bruit de fond) à partir de l’image binaire des germes de fibres. L’image résultante contient toutes les fibres de la première image binaire, reconstruites à l’identique, ayant au moins un germe dans la seconde image binaire.
Ici, la reconstruction utilise la 4-connexité, ce qui signifie que la reconstruction s’effectue de proche en proche en considérant que chaque pixel a quatre voisins dans les directions 0, 90, 180 et 270 degrés (les pixels ayant une arête communes). b3 = AphImgNew("Binary3")
AphImgReconstruct b1,b2,b3,graph4C
51
APHELION 3.2 - Manuel d’installation & Didacticiel
La fonction suivante, AphImgFree, supprime les images binaires Binary1 et Binary2, qui ne sont plus nécessaires pour la suite de l’application.
AphImgFree b1
AphImgFree b2
Certaines fibres de l’image binaire sont encore connectées. L’utilisation d’opérateurs de segmentation binaire basés sur des techniques de morphologie mathématique segmenteront toutes les fibres. L’opérateur AphImgClustersSplitConvex est basé sur l’algorithme de la ligne de partage des eaux. b4 = AphImgNew("Binary4")
AphImgClustersSplitConvex b3, b4, 10, graph4C
AphImgHoleFill est maintenant appliqué pour boucher les trous dans les fibres de l’image binaire précédente.
AphImgHoleFill b4, b4, graph8C
AphImgBorderKill élimine les objets intersectant les bords de l’image (fibres incomplètes). Remarquez qu’ici les images d’entrée et de sortie sont identiques.
Cette caractéristique est supportée par Aphelion pour tous les opérateurs qui ont une image d’entrée et une image de sortie de même classe et de même type. Cet opérateur utilise la 4-connexité.
AphImgBorderKill b4, b4, graph4C
L’opérateur AphImgClustersToLabels génère une image étiquette à partir d’une image binaire. Dans l’image étiquette, un niveau de gris différent est associé à chaque objet.
Tous les pixels d’un même objet connexe ont la même valeur. Les valeurs des
étiquettes varient de 1 au nombre d’objets. Le premier objet est le premier rencontré lors d’un balayage de gauche à droite, et de haut en bas. L’étiquetage est effectué en prenant en compte la connexité. l1 = AphImgNew("Label")
AphImgClustersToLabels b4, l1,_
AphImgFree b4
52
APHELION 3.2 - Manuel d’installation & Didacticiel
Après l’étiquetage, il est alors possible de passer de la représentation image à la représentation symbolique. L’ensemble d’objets appelé FIBERS est alors créé par l’opérateur AphImgLabelsObj. L’ensemble d’objets FIBERS a une représentation spatiale de type Region des fibres et quelques attributs de base (scalar attributes), tels que le nombre de pixels de chaque région. Une manière d’analyser ces données est d’utiliser les fonctionnalités de la grille d’Aphelion. Une grille est comparable à un tableau de mesures ou un tableur dans lequel chaque ligne correspond à une étiquette ou objet et chaque colonne à un attribut ou mesure.
AphImgLabelsObj l1, AphObjNew("FIBERS")
Après avoir créé les objets FIBERS, il est possible d’analyser chaque région et de calculer leur enveloppe convexe à partir de la représentation en région, le meilleur moyen pour calculer l’enveloppe convexe d’un objet étant de le faire à partir de ses contours.
AphRegionConvexHullPolygons AphObj("FIBERS")
Les objets FIBERS peuvent être affichés dans une grille (attributs scalaires) ou en superposition à l’image (représentation spatiale – régions remplies ou contourées).
L’opérateur AphObjDraw dessine ici le contour des objets FIBERS, sous forme polygonale, sur l’image originale.
AphObjDraw original, AphObj("FIBERS"), "POLYGON"
L’ensemble d’objets contient une information complète sur les fibres. Vous pouvez filtrer les objets à partir des mesures de base ou calculer l’ensemble des mesures sur les fibres en utilisant AphObjComputeMeasurements.
P
IXEL
C
OUNT
P
OLYGON
.E
XTENTS
.
LL
.X
P
P
OLYGON
OLYGON
.E
.E
XTENTS
XTENTS
.
.
LL
UR
.Y
.X
Nombre de pixels dans chaque objet
Coordonnée en X de plus faible valeur du polygone
Coordonnée en Y de plus faible valeur du polygone
Coordonnée en X de plus forte valeur du polygone
53
APHELION 3.2 - Manuel d’installation & Didacticiel
P
P
R
R
R
R
OLYGON
OLYGON
EGION
EGION
EGION
EGION
.E
.E
.E
.E
.E
.N
XTENTS
.
UR
UMPOINTS
XTENTS
XTENTS
XTENTS
XTENTS
.
.
.
.
LL
LL
UR
UR
.X
.Y
.Y
.X
.Y
Coordonnée en Y de plus forte valeur du polygone
Nombre de côtés de l’enveloppe convexe de l’objet
Coordonnée en X de plus faible valeur de la région
Coordonnée en Y de plus faible valeur de la région
Coordonnée en X de plus forte valeur de la région
Coordonnée en Y de plus forte valeur de la région
La boîte de dialogue FBox permet à l’utilisateur de choisir quel filtre il désire appliquer. Quatre filtres sont proposés en fonction de quatre paramètres : surface, position, élongation et compacité. response% = Dialog(FBox)
Select Case response%
Case –1' OK button
If FBox.surface Then
La fonction suivante filtre l’ensemble d’objets FIBERS et envoie le résultat dans l’ensemble d’objets SURFACE. L’attribut sur lequel le filtrage est effectué est
PIXEL_COUNT. Les seuils bas et haut sont respectivement égaux à 1000 et 1400.
AphObjNew("SURFACE"),
1000,
AphObjDraw affiche l’ensemble d’objets résultant sur l’image originale.
AphObjDraw i1, AphObj("SURFACE"), "POLYGON"
54
APHELION 3.2 - Manuel d’installation & Didacticiel
La fonction suivante filtre les objets en fonction de leur position dans l’image.
Comme la valeur d’étiquette la plus petite correspond à l’objet placé le plus haut dans l’image, il suffit de filtrer selon la valeur de TOKEN_INDEX. Les seuils choisis sont
1 et 10. Un nouvel ensemble d’objets ISR nommé LOCATION est alors créé.
If FBox.location Then
AphObjNew("LOCATION"),
AphObjDraw i2, AphObj("LOCATION"), "POLYGON"
MsgOpen "Selection of the 10 first fibers",_ breaktime, False
MsgClose
La fonction suivante filtre les objets selon la valeur de l’élongation. Cette mesure est calculée sur les régions et non sur les contours. Les seuils choisis sont 0 et 0.05
(c’est-à-dire les régions les moins allongées). Un nouvel ensemble d’objets ISR nommé ELONGATION est créé.
If FBox.elongation Then
AphObjDraw i3, AphObj("ELONGATION"), "POLYGON"
MsgOpen "Fibers with elongation between 0 and
0.05",_ breaktime, False
MsgClose
La fonction suivante filtre les objets selon leur circularité. D’abord, la fonction
AphObjAttributeRatio génère un nouvel attribut nommé A1, égal à AREA divisé par
PERIMETER pour chaque objet. Ensuite, un autre attribut, A2, est généré ; il est égal
à A1 divisé par PERIMETER, ou encore à AREA divisé par le carré de
55
APHELION 3.2 - Manuel d’installation & Didacticiel
PERIMETER. La circularité est définie par ce rapport. Les deux seuils choisis sont
0.045 et 0.06. Ce filtre montre comment créer de nouveaux attributs à partir d’attributs existants. Pour plus d’information sur la création de nouveaux attributs à partir de BasicScript, référez-vous aux fonctions dont le nom commence par AphObj, comme AphObjAttributeRatio, AphObjAddAttribute ou AphObjSetAttribute. Le résultat final est affiché en superposition sur l’image originale.
If FBox.compacity Then
"PIXEL_COUNT", "A1"
"PERIMETER",
AphObjNew("COMPACITY"),
AphObjDraw i4, AphObj("COMPACITY"), "POLYGON"
MsgOpen "Fibers whose shape is close to a circle",_ breaktime, False
MsgClose
Case 0' Cancel button
MsgBox "Cancel button doesn't exist!"
End Select
Cette dernière boîte de dialogue demande à l’utilisateur s’il désire ou non supprimer toutes les images et les objets créés durant l’exécution de la macro. Le premier choix est la suppression de toutes ces images et de ces objets ; ABox.OptionGroup1 prend alors la valeur 0. La variable response% est la valeur retournée par la fonction
Dialog. response% = Dialog(ABox)
If ABox.OptionGroup1 = 0 Then
If (i1<>0) Then
56
APHELION 3.2 - Manuel d’installation & Didacticiel
If (i2<>0) Then
If (i3<>0) Then
If (i4<>0) Then
End If
C’est la fin de la macro et de la sous-routine main. L’appel de la fonction End Sub termine cette sous-routine.
End Sub
57

Lien public mis à jour
Le lien public vers votre chat a été mis à jour.
Caractéristiques clés
- Installation et configuration du logiciel
- Chargement et sauvegarde d'images dans divers formats
- Visualisation avancée d'images avec histogrammes et profils
- Application d'opérateurs de traitement d'image
- Extraction et analyse d'objets
- Génération de rapports d'analyse
- Édition de macros pour l'automatisation