GX-TXT Curve Digitalizer: dalla microfotografia botanica all’analisi morfometrica con Python
In questa guida utilizziamo GX-TXT per ricavare informazioni quantitative da una microfotografia ottica di tessuto vegetale. L’esperimento comprende la calibrazione micrometrica, la digitalizzazione dei contorni di quattro stomi e la successiva analisi geometrica mediante l’editor Python integrato nel framework.
Il Curve Digitalizer si occupa esclusivamente dell’acquisizione delle coordinate. Il calcolo delle aree, dei perimetri e l’interpolazione dei contorni sono affidati a uno script Python che utilizza le API pubbliche GX-TXT.
1. Materiale e obiettivo
La microfotografia utilizzata proviene da un articolo pubblicato su Frontiers in Plant Science, DOI 10.3389/fpls.2025.1676435.
Abbiamo selezionato il pannello B, relativo a stomi di Borago officinalis, conservando la barra di riferimento da 50 µm.
Il file utilizzato per l’esperimento è borago_panel_B_complete.png, con dimensioni di 847 × 568 pixel.

L’obiettivo consiste nel digitalizzare due contorni per ciascuno stoma: il limite esterno dell’apparato stomatico e quello dell’apertura centrale, o poro stomatico.
Da queste coordinate ricaveremo successivamente superfici e perimetri, distinguendo sempre i dati sperimentali dalle rappresentazioni matematiche interpolate.
2. Creazione della sessione e importazione
Dalla sezione Acquisition → Image importer abbiamo importato la microfotografia come Canonical Image Dataset, assegnandole l’identificativo borago_panel_b_complete.

Successivamente abbiamo aperto Viewers → Digitalizer, creato la configurazione stomi06 e associato esplicitamente il Dataset immagine.
La verifica dell’anteprima ha consentito di controllare l’integrità della sorgente prima di procedere con la calibrazione.
3. Calibrazione geometrica
Per convertire le coordinate dell’immagine in grandezze fisiche abbiamo utilizzato la barra micrometrica presente nella fotografia.
Nella scheda Calibration è stata selezionata la calibrazione dell’intera immagine, impostando entrambi gli assi come lineari e mantenendo l’asse Y crescente verso l’alto.
Con Scale bar → Endpoints sono stati individuati i due estremi della barra da 50 µm.

La distanza rilevata è stata:
Da cui il fattore di conversione:
La scala è stata applicata mediante Apply scale.

La misura di calibrazione è stata successivamente accettata, raggiungendo lo stato Active · accepted.

La precisione numerica del fattore di conversione non deve essere confusa con l’accuratezza della misura. La selezione dei riferimenti sulla barra e la qualità dell’immagine introducono inevitabilmente incertezze.
4. Preparazione dell’immagine per la digitalizzazione
Prima di procedere alla digitalizzazione dei contorni, l’immagine è stata elaborata attraverso gli strumenti di Image Processing del Curve Digitalizer.
Lo scopo non era modificare le dimensioni delle strutture, ma migliorare la leggibilità dei bordi.
I parametri utilizzati sono stati:
| Parametro | Valore |
|---|---|
| Brightness/contrast | Attivo |
| Brightness | 0,0 |
| Contrast | 39,0 |
| Show processed preview | Attivo |
| Altri filtri visibili | Disattivati |

La possibilità di confrontare direttamente Original e Processed è particolarmente utile in questo esperimento.
La regolazione del contrasto rende più riconoscibili alcuni margini, ma non elimina le ambiguità della microscopia ottica. In particolare, le sfumature dei bordi cellulari possono rendere difficile identificare un contorno univoco.
Poiché la regolazione è fotometrica e non geometrica, la calibrazione spaziale conserva la propria validità.
5. Digitalizzazione degli stomi
Abbiamo selezionato quattro stomi sufficientemente distinguibili nell’immagine.
Per ciascuno sono stati acquisiti due contorni indipendenti:
| Stoma | Contorno esterno | Poro stomatico |
|---|---|---|
| 01 | stoma_01_outer | stoma_01_pore |
| 02 | stoma_02_outer | stoma_02_pore |
| 03 | stoma_03_outer | stoma_03_pore |
| 04 | stoma_04_outer | stoma_04_pore |
I contorni esterni rappresentano il limite selezionato dell’apparato stomatico; quelli interni seguono invece il margine dell’apertura centrale.

Il dataset contiene complessivamente 450 punti:
- Sette curve con 50 punti ciascuna.
- Una curva,
stoma_04_outer, con 100 punti.
L’ordine dei punti è quello di inserimento. Non è stata richiesta alcuna monotonicità.
Questa impostazione è necessaria perché un contorno chiuso non può essere descritto correttamente mediante il semplice ordinamento per ascissa.
La qualità dei contorni dipende dalla visibilità dei bordi e dall’interpretazione dell’operatore. Non è possibile garantire un tracciamento geometricamente perfetto.
6. Pubblicazione del dataset
Completata la digitalizzazione, nella scheda Publish abbiamo selezionato la calibrazione accettata e pubblicato i risultati.
Il Dataset generato è:
digitized.stomi06.measurement_1.curves

Il contratto del Dataset è table.generic.
Le colonne pubblicate sono:
| Colonna | Significato |
|---|---|
x | Coordinata X in µm |
y | Coordinata Y in µm |
curve_id | Identificativo stabile della curva |
curve_label | Nome leggibile della curva |
point_index | Ordine del punto nella curva |
point_id | Identificativo del punto |
pixel_x | Coordinata X nell’immagine originale |
pixel_y | Coordinata Y nell’immagine originale |
Sono quindi conservate sia le coordinate fisiche sia le coordinate nell’immagine sorgente.
7. Elaborazione con l’editor Python integrato
Per eseguire le analisi geometriche abbiamo utilizzato Python Script Workspace, già disponibile nel framework.
Lo script stomata_06_user_contours.py è stato registrato nella sessione con identificativo guida06stomi, versione 1.0.0.
L’accesso al Dataset avviene attraverso il client pubblico di GX-TXT:
from gxtxt import (
gxtxt_context,
gxtxt_api_require,
gxtxt_api_call,
)
dataset_id = "digitized.stomi06.measurement_1.curves"
gxtxt_api_require("CANONICAL_DATASET_API_v2@2")
metadata = gxtxt_api_call(
"CANONICAL_DATASET_API_v2",
"describe",
[dataset_id],
)
Per leggere i punti è possibile invocare read_range, utilizzando i Variable ID effettivamente associati alle coordinate e ai contorni.
Lo script raggruppa le coordinate per curva e le riordina secondo point_index.
Calcolo dell’area
Per un contorno poligonale chiuso viene applicata la formula di Gauss:
Calcolo del perimetro
Il perimetro è ottenuto sommando le distanze fra vertici consecutivi:
Lo script chiude numericamente il profilo collegando l’ultimo punto al primo, senza modificare il Dataset originale.
Per ciascuno stoma vengono quindi calcolati l’area esterna, l’area del poro, l’area per differenza e il rapporto fra le due superfici.
Risultati sperimentali
| Stoma | Area esterna (µm²) | Area poro (µm²) | Area per differenza (µm²) | Poro/esterno |
|---|---|---|---|---|
| 01 | 324,43 | 22,29 | 302,14 | 6,87% |
| 02 | 390,35 | 24,94 | 365,41 | 6,39% |
| 03 | 329,38 | 24,99 | 304,38 | 7,59% |
| 04 | 296,49 | 24,49 | 272,00 | 8,26% |
| Media | 335,16 | 24,18 | — | 7,28% |
I perimetri calcolati sono:
| Stoma | Esterno (µm) | Poro (µm) |
|---|---|---|
| 01 | 66,70 | 34,75 |
| 02 | 74,08 | 35,26 |
| 03 | 66,20 | 27,00 |
| 04 | 63,27 | 28,15 |
La deviazione standard campionaria delle aree dei pori è 1,28 µm².
Questa grandezza descrive la dispersione delle misure fra i quattro contorni, non l’incertezza di ogni singola misura.

L’esecuzione dello script nell’editor Python di GX-TXT è terminata con stato PASS e codice di uscita 0.

8. Interpolazione dei contorni mediante spline
Le curve digitalizzate rappresentano profili chiusi, per i quali non è generalmente appropriata una funzione del tipo \(y=f(x)\).
Abbiamo quindi utilizzato una rappresentazione parametrica:
Il parametro \(t\) viene definito sulla base della lunghezza cumulativa delle corde fra i vertici.
Attraverso scipy.interpolate.CubicSpline sono state costruite spline cubiche periodiche che attraversano i punti acquisiti.
Questa elaborazione è contenuta nello script stomata_06_periodic_fit.py.

La rappresentazione interpolata permette di visualizzare i profili con maggiore continuità e di confrontare l’area del poligono originale con quella della curva interpolata.
| Stoma | Contorno | Area poligono (µm²) | Area spline (µm²) | Differenza |
|---|---|---|---|---|
| 01 | Esterno | 324,4279 | 325,3744 | +0,29% |
| 01 | Poro | 22,2893 | 22,4751 | +0,83% |
| 02 | Esterno | 390,3491 | 391,4748 | +0,29% |
| 02 | Poro | 24,9368 | 25,1435 | +0,83% |
| 03 | Esterno | 329,3790 | 330,5078 | +0,34% |
| 03 | Poro | 24,9944 | 25,1140 | +0,48% |
| 04 | Esterno | 296,4921 | 296,7113 | +0,07% |
| 04 | Poro | 24,4881 | 24,6059 | +0,48% |
Le differenze sono contenute fra +0,07% e +0,83%.
Questo confronto descrive l’effetto numerico dell’interpolazione. Non dimostra che la curva interpolata sia anatomicamente più accurata del contorno digitalizzato.
9. Utilizzare le API pubbliche da Python
Un aspetto interessante dell’esperimento è la possibilità di interrogare le informazioni scientifiche già pubblicate dal Curve Digitalizer.
Non è necessario conoscere anticipatamente la posizione delle colonne nel CSV o affidarsi esclusivamente ai loro nomi.
La documentazione di GX-TXT prevede una API pubblica specifica:
CURVE_DIGITIZER_DATASET_SCHEMA_API_v1
Questa API associa i ruoli semantici alle variabili effettivamente pubblicate.
Nella versione utilizzata essa è accessibile direttamente dall’ambiente Tcl del framework, ma non è ancora registrata come chiamata diretta nel Python Script Bridge.
Python può comunque recuperare indirettamente le informazioni pubblicate interrogando le API pubbliche del CORE.
Le API interessate sono:
DATASET_METADATA_API_v1DATASET_VARIABLE_SCHEMA_API_v3CANONICAL_DATASET_API_v2
Un esempio di interrogazione è:
from gxtxt import gxtxt_api_require, gxtxt_api_call
dataset_id = "digitized.stomi06.measurement_1.curves"
gxtxt_api_require("DATASET_METADATA_API_v1@1")
gxtxt_api_require("DATASET_VARIABLE_SCHEMA_API_v3@3")
gxtxt_api_require("CANONICAL_DATASET_API_v2@2")
metadata = gxtxt_api_call(
"DATASET_METADATA_API_v1",
"read",
[dataset_id],
)
schema = gxtxt_api_call(
"DATASET_VARIABLE_SCHEMA_API_v3",
"list",
[dataset_id],
)
description = gxtxt_api_call(
"CANONICAL_DATASET_API_v2",
"describe",
[dataset_id],
)
Il Dataset del Curve Digitalizer contiene metadati che associano ruoli quali curve_key, curve_name e point_order agli effettivi Variable ID.
Una volta recuperate e validate queste associazioni, Python può leggere le colonne corrette tramite la Canonical Dataset API.
Il file stomata_06_api_discovery.py contiene un esempio esplorativo di questa procedura, ancora da validare attraverso un’esecuzione completa nell’editor.
Quality API
La CURVE_DIGITIZER_QUALITY_API_v2 è invece direttamente disponibile dal Python Script Bridge.
Permette di interrogare informazioni diagnostiche relative ai punti e alle curve pubblicate.
Per esempio:
from gxtxt import gxtxt_api_require, gxtxt_api_call
import json
gxtxt_api_require("CURVE_DIGITIZER_QUALITY_API_v2@2")
quality = gxtxt_api_call(
"CURVE_DIGITIZER_QUALITY_API_v2",
"diagnostics",
[dataset_id],
)
report = json.loads(quality["report_json"])
for curve in report["curves"]:
print(
curve["curve_label"],
curve["point_origins"],
)
Questa API fornisce informazioni strutturali e diagnostiche, ma non certifica l’accuratezza dei contorni.
Image Processing API
La CURVE_DIGITIZER_IMAGE_PROCESSING_API_v1 consente di recuperare le operazioni di elaborazione e la provenienza di immagini elaborate e pubblicate come Dataset.
Nel nostro esperimento il contrasto è stato utilizzato principalmente come anteprima per facilitare la digitalizzazione. Non va quindi confusa questa regolazione visuale con la pubblicazione di un nuovo Dataset immagine elaborato.
Calibration API
La CURVE_DIGITIZER_CALIBRATION_API_v1 dispone di metodi pubblici Tcl per interrogare le calibrazioni e le trasformazioni geometriche.
Anche se non direttamente esposta nel Python Script Bridge della versione utilizzata, alcune informazioni di calibrazione pubblicate sono accessibili indirettamente mediante le API di metadata del CORE.
10. Limiti metrologici e interpretazione
L’esperimento mostra un percorso di acquisizione ed elaborazione numerica, ma non costituisce una misura morfometrica biologicamente validata.
I contorni dipendono dalla qualità della microfotografia, dalla visibilità dei bordi e dalle scelte dell’operatore durante la digitalizzazione.
Il miglioramento del contrasto facilita il lavoro, ma non recupera informazioni anatomiche assenti nell’immagine originale.
Anche l’interpolazione mediante spline rappresenta una scelta matematica: può produrre un contorno più continuo senza necessariamente aumentarne l’accuratezza fisica.
Quattro stomi selezionati nella stessa microfotografia non costituiscono repliche biologiche indipendenti.
Un’analisi più rigorosa richiederebbe un protocollo definito per individuare i margini, valutazioni ripetute e una stima dell’incertezza della calibrazione e del posizionamento dei punti.
La differenza fra area esterna e area del poro deve inoltre essere interpretata come area geometrica planare, non automaticamente come superficie anatomica reale delle cellule di guardia.
11. Materiale per riprodurre l’esperimento
Conclusione
La Guida 06 dimostra un processo completo di acquisizione e analisi:
Microfotografia ottica → preparazione dell’immagine → calibrazione micrometrica → digitalizzazione dei contorni → pubblicazione dei dataset → elaborazione Python → rappresentazione interpolata e analisi geometrica.
L’aspetto fondamentale è la separazione delle responsabilità: il Curve Digitalizer acquisisce e pubblica i dati, mentre l’editor Python e le API pubbliche di GX-TXT permettono di elaborarli scientificamente.
Altre tappe del progetto
- Curve Digitizer in GX-TXT: le curve dei datasheet diventano Dataset
- Dal grafico al Dataset scientifico: il primo esperimento con GX-TXT Curve Digitalizer
- GX-TXT Curve Digitalizer — digitalizzare una famiglia di curve con calibrazioni multiple
- GX-TXT Curve Digitalizer — digitalizzare una curva con assi logaritmici
- GX-TXT Curve Digitalizer – digitalizzazione scientifica con doppio asse Y, calibrazione e propagazione delle incertezze