OpenCV è una libreria di visione artificiale generalista, scritta per la robotica e la visione industriale, e proprio per questo lavora bene su una fetta ben delimitata dell’imaging medicale: le immagini 2D di qualità fotografica. La libreria — Open Source Computer Vision Library, nata in Intel Research nel 1999-2000 per iniziativa di Gary Bradski, prima release stabile 1.0 nell’ottobre 2006, licenza BSD — non contiene nulla di specifico per la medicina. Eppure compare sempre più spesso nelle pubblicazioni biomediche del 2007-2008, perché le operazioni di base che mette a disposizione sono quelle che servono prima di qualunque classificazione: filtraggio, segmentazione, estrazione di descrittori numerici.

Scrivo questa nota dopo alcuni mesi di lavoro con la 1.x su immagini di fondo oculare e su strisci microscopici, in un contesto di ricerca, non di prodotto. È una distinzione che cambia tutto, e ci torno alla fine.

Contesto e dominio applicativo

Il riferimento per l’imaging medicale resta ITK (Insight Segmentation and Registration Toolkit), nato nel 1999 sotto contratto della U.S. National Library of Medicine attorno al Visible Human Project. ITK nasce per i volumi 3D, per la registrazione e la segmentazione di TC e RM, e il suo modello a pipeline templatizzato in C++ riflette quella vocazione. OpenCV occupa un terreno diverso: immagini 2D, di tipo fotografico, dove ogni pixel è un campione su una griglia regolare e l’analisi non chiede di ragionare su un volume.

Buona parte delle modalità diagnostiche produce esattamente questo tipo di input. La mammografia digitale è una proiezione 2D. La retinografia e la fotografia del fondo oculare sono immagini a colori. La dermatoscopia, la microscopia ottica, l’endoscopia, i preparati di patologia digitale: tutte 2D, tutte trattabili con gli stessi operatori che OpenCV applica a una foto qualsiasi. Per questi domini la libreria ha un repertorio già pronto; per i volumi di TC e RM è lo strumento sbagliato, e spingerla in quella direzione vuol dire reimplementare ciò che ITK fa già.

Cosa offre la 1.x

La versione 1.0 è una libreria in C, con la struttura dati IplImage ereditata dalla Intel Image Processing Library a fare da contenitore dell’immagine. È in corso una riscrittura in C++ attorno a una nuova struttura cv::Mat, ma il codice che oggi si scrive in produzione è C con quelle convenzioni. Il repertorio utile alle immagini biomediche si divide in pochi blocchi.

Pre-processing e filtraggio: conversioni di spazio colore (RGB, HSV, scala di grigi), istogrammi ed equalizzazione, filtri gaussiano, mediano e bilaterale, gradienti di Sobel e Laplaciano, rilevamento di bordi con Canny. Su una mammografia servono a schiacciare il fondo e a far emergere le microcalcificazioni; su un fondo oculare a normalizzare l’illuminazione disomogenea tipica dell’acquisizione.

Operazioni morfologiche: erosione, dilatazione, apertura, chiusura, top-hat, watershed. Sono il pane quotidiano della segmentazione di strutture su sfondo rumoroso — separare nuclei cellulari adiacenti, ripulire una maschera binaria, isolare una lesione pigmentata dalla cute intorno.

Segmentazione e analisi di forma: thresholding globale, adattivo e con il metodo di Otsu; estrazione di contorni e loro approssimazione; componenti connesse; trasformata di Hough per linee e cerchi, comoda per localizzare il disco ottico o tracciare strutture vascolari rettilinee. Da un contorno si ricavano momenti, area, perimetro, descrittori di forma — i numeri grezzi su cui poi gira un classificatore.

Feature detection: corner di Harris e Shi-Tomasi (cvGoodFeaturesToTrack), rilevatore FAST, regioni MSER. Qui va segnalato un vincolo concreto: SIFT (Lowe, 2004) e SURF (Bay, 2006), i descrittori più usati per il matching robusto, sono coperti da brevetto. Si possono usare in ricerca, ma chi pensa a un prodotto deve metterlo in conto dal primo giorno.

Classificazione: il modulo di machine learning comprende SVM (wrapper su libsvm), k-nearest neighbours, classificatori boosted con AdaBoost, Random Trees, Normal Bayes, percettroni multistrato poco profondi ed Expectation-Maximization. Basta per molti studi pilota senza uscire dalla libreria.

Punto critico: il rilevatore Viola-Jones

L’elemento di OpenCV che ha avuto più ricadute sull’imaging medicale è il rilevatore a cascata di Viola e Jones, descritto nel 2001 e disponibile out-of-the-box tramite cvHaarDetectObjects. Funziona così: una finestra scorre sull’immagine a scale diverse e a ogni posizione attraversa una sequenza di stadi; ogni stadio valuta feature di tipo Haar — somme e differenze di rettangoli chiari e scuri, calcolate in tempo costante grazie all’immagine integrale — e se uno stadio boccia la finestra, quella finestra viene scartata subito. La maggior parte delle finestre cade nei primi stadi, ed è questo che rende veloce il rilevatore.

OpenCV distribuisce cascate pre-addestrate per i volti, ma per la medicina il volto non è il punto: il punto è la pipeline di addestramento fornita con la libreria, con cui si addestra una cascata propria su esempi positivi e negativi. Qualcuno l’ha usata per provare a rilevare microcalcificazioni in mammografia, cellule in un preparato, regioni di interesse in immagini ripetitive. Il metodo ha un limite strutturale ben noto: regge bene su pattern frontali e poco variabili, e perde rapidamente efficacia su oggetti con forte variabilità di forma, scala e orientamento — la condizione tipica delle lesioni reali. È un punto di partenza ragionevole, non una soluzione che si trasferisce senza lavoro.

Il flusso di lavoro tipico

Un progetto di ricerca clinica che adotta OpenCV segue quasi sempre lo stesso percorso. L’immagine arriva nel suo formato nativo — DICOM, TIFF, PNG — e va caricata: OpenCV non legge DICOM, quindi il caricamento passa per una libreria dedicata come DCMTK o GDCM, e i pixel vengono poi travasati in un IplImage. Segue il pre-processing con gli operatori della libreria, poi l’estrazione di feature numeriche (momenti, descrittori di texture, forma, colore). La classificazione si fa dentro OpenCV oppure esportando le feature verso WEKA o R, che hanno strumenti statistici più ricchi. Si chiude con la validazione: cross-validation, curve ROC, confronto con la verità di riferimento annotata dal clinico.

In questi mesi sta cambiando anche il linguaggio con cui si scrive tutto questo. I binding Python della libreria, con NumPy accanto, diventano un’alternativa concreta a MATLAB per la prototipazione nella ricerca biomedica accademica: stessa logica vettoriale, codice più leggibile, nessun costo di licenza. Per ora è un’opzione emergente, con binding non sempre completi rispetto all’API C.

Limiti

OpenCV ha confini netti quando lo si porta in medicina, e conviene enunciarli prima di avviare un progetto, non dopo.

DICOM non è nativo: serve sempre un parser esterno, e con quello va gestita la conversione corretta dei valori di pixel (rescale slope/intercept, finestratura) che OpenCV ignora del tutto. I volumi 3D sono fuori scope: per TC e RM lo strumento è ITK. La precisione numerica non è la priorità della libreria, orientata alla prestazione fin dalla nascita; operazioni delicate come l’interpolazione di alta qualità o la registrazione sub-pixel chiedono attenzione in più e a volte una libreria diversa.

Il limite che pesa di più non è tecnico. La licenza BSD consente di usare OpenCV in un prodotto commerciale, ma usare un componente del genere dentro un dispositivo medico è un’altra faccenda: qualificare il software come parte di un sistema regolamentato comporta un ciclo di vita documentato e una gestione del rischio da pianificare dal primo giorno, non da appiccicare alla fine. Una libreria generalista, sviluppata da una comunità senza obblighi verso il dominio clinico, non porta con sé nessuna di queste garanzie: le deve mettere chi la integra.

E poi c’è la variabilità dei dati, che nessuna libreria risolve. Protocolli di acquisizione diversi, scanner diversi, illuminazione non controllata in dermatoscopia ed endoscopia: un metodo che gira bene sul dataset di un centro spesso non si generalizza a quello di un altro. Non è un difetto di OpenCV, è la condizione di partenza con cui si lavora, e la libreria non la nasconde né la peggiora — la lascia intera al ricercatore.

Per chi avvia oggi uno studio su immagini 2D non volumetriche, OpenCV 1.x è lo strumento open source più maturo e meglio documentato a disposizione, con una transizione verso il C++ già visibile all’orizzonte. Restare sulla 1.x stabile o aspettare la riscrittura è un compromesso fra ciò che gira oggi e ciò che girerà meglio domani.


Immagine di copertina: Fotografia del fondo oculare di un occhio destro sano: cerchio arancio-rossastro con il disco ottico chiaro sulla destra, la macula… — foto di Mikael Häggström, CC0 — https://commons.wikimedia.org/wiki/File:Fundus_photograph_of_normal_right_eye.jpg