Dalla Fisica alla Diagnosi: Come strutturare una pipeline di Pre-Processing nell’imaging medicale

L’immagine diagnostica è il risultato finale di una catena complessa che inizia con la fisica delle alte energie e termina con un algoritmo di ottimizzazione. Per medici, radiologi e sviluppatori, comprendere questa pipeline è il fondamento per trasformare un segnale grezzo, rumoroso e spesso ingannevole in un’informazione clinicamente acuta e quantitativamente affidabile.

In questo articolo andremo a capire la fisica per poi tradurre ogni fase del processing in codice C++, costruendo una pipeline ottimizzata per il valore diagnostico.

1. Dalla Fisica alla Digitalizzazione: Il Percorso del Segnale Radiografico

Prima di addentrarci nell’analisi dei dati, è fondamentale comprendere la loro origine fisica, che inizia con collisioni subatomiche. Il processo può essere suddiviso in due fasi principali:

Creazione e Caratteristiche del Fascio (Fonte di Raggi X)

I raggi X sono generati in un tubo ad alta tensione (fino a 150 kV) dove un flusso di elettroni accelerati impatta su un bersaglio di tungsteno. Soltanto l’1% dell’energia cinetica si converte in raggi X, mentre il restante 99% è dissipato come calore. Questo avviene tramite due processi:

  • Bremsstrahlung (Radiazione di Frenamento): Il meccanismo predominante. Gli elettroni sono deviati (“frenati”) dai nuclei di tungsteno, rilasciando fotoni X con uno spettro di energie continuo (ampia gamma).
  • Radiazione Caratteristica: L’urto degli elettroni rimuove elettroni interni dal tungsteno. Il successivo “salto” degli elettroni esterni per riempire la lacuna produce fotoni X a energie discrete e ben definite (picchi specifici nello spettro).
Interazione con la Materia (Formazione del Contrasto)

L’immagine radiografica è il risultato dell’attenuazione differenziale del fascio di raggi X mentre attraversa i tessuti del paziente. Questa “ombra” è determinata da due interazioni principali:

  • Effetto Fotoelettrico (Contrasto Diagnostico): Il fotone X viene assorbito completamente, cedendo tutta la sua energia. È l’effetto dominante nei tessuti ad alto numero atomico (Z), come le ossa (ricche di calcio, Z=20), e genera le aree chiare (radiopache) dell’immagine. È il principale responsabile del contrasto necessario per la diagnosi.
  • Scattering Compton (Rumore e Nebbia): Il fotone X interagisce parzialmente, perdendo solo parte della sua energia e deviando in una direzione casuale. È prevalente nei tessuti molli (basso Z). I fotoni deviati colpiscono il sensore in modo non informativo, creando una velatura grigia che degrada il contrasto e introduce rumore.

In conclusione, l’immagine finale è una mappatura dell’assorbimento e della diffusione: l’aria (bassa densità) risulta nera, i tessuti molli sono grigi (dominanza dello scattering) e le strutture dense come le ossa sono bianche (dominanza dell’assorbimento). L’intensità del fascio dopo l’attraversamento è descritta dalla Legge di Lambert-Beer

2. L’Acquisizione: Dalla Scintillazione alla Matrice Digitale

Dopo aver attraversato il paziente, i raggi X colpiscono un Rivelatore a Pannello Piatto (FPD), che converte l’ombra invisibile in un’immagine digitale. Questo processo segue principalmente due metodi:

Conversione Indiretta

È il metodo più comune e si svolge in due fasi:

  • Scintillatore: Un primo strato (spesso Ioduro di Cesio, CsI) assorbe i raggi X e li converte in luce visibile. I migliori scintillatori sono “strutturati” (ad aghi) per incanalare la luce dritta verso il basso, evitando la diffusione e aumentando la nitidezza.
  • Fotodiodo: Uno strato sottostante di fotodiodi (Silicio amorfo) cattura la luce e la trasforma in una carica elettrica
Conversione Diretta

Questo metodo, più avanzato, elimina il passaggio della luce. I raggi X colpiscono direttamente uno strato semiconduttore (come il Selenio amorfo). L’energia del raggio X crea immediatamente una carica elettrica (coppie elettrone-lacuna). Il vantaggio è dato dal fatto che non essendoci luce, non c’è diffusione. Questo permette una risoluzione spaziale intrinsecamente superiore.

Il Risultato Finale: La Matrice Digitale

Indipendentemente dal metodo, il risultato è una griglia di pixel, ognuno con una carica elettrica proporzionale ai raggi X ricevuti.

  • Lettura (TFT): Una griglia di transistor (TFT) “legge” il livello di carica accumulato da ciascun pixel.
  • Digitalizzazione (ADC): Un Convertitore Analogico-Digitale (ADC) misura questa carica (analogica) e le assegna un numero digitale (un livello di grigio, solitamente a 14 o 16 bit).

L’immagine finale è una matrice di numeri dove:

  • Valori Alti (Nero): Tanta carica = molti raggi X sono arrivati (es. aria nei polmoni).
  • Valori Bassi (Bianco): Poca carica = pochi raggi X sono arrivati (es. ossa).

3. Fase 2: Correzione degli Artefatti

Il processo di acquisizione delle immagini può introdurre diversi artefatti che compromettono la qualità finale. La correzione efficace richiede l’applicazione di algoritmi specifici per la natura del difetto.

Gli artefatti possono essere categorizzati in base alla loro origine:

Difetti del Rivelatore (Statici)

Questi sono errori intrinseci del sensore:

  • Pixel Morti/Accesi (Dead/Hot Pixels): Singoli elementi del rivelatore bloccati in modo permanente sul valore minimo (nero, “spento”) o massimo (bianco, “acceso”).
  • Artefatti a Striscia/Anello (Stripe/Ring Artefacts): Intere linee (righe o colonne) del rivelatore che presentano una risposta non uniforme o anomala.
Difetti di Acquisizione (Dinamici)

Questi sono causati da eventi durante la misurazione:

  • Artefatti da Movimento (Motion Artefacts): Causati dal movimento del campione durante l’acquisizione, con conseguente sfocatura dell’immagine.
Difetti della Fisica

Questi derivano dalle interazioni tra il fascio di raggi X e il campione:

  • Indurimento del Fascio (Beam Hardening): Il fascio X è policromatico; i materiali più densi assorbono maggiormente i fotoni a bassa energia. Il fascio rimanente è “più duro” e genera:
    • Artefatti a Striscia (Streak Artefacts): Strisce scure visibili tra due strutture ad alta densità.
    • Artefatti a Tazza (Cupping Artefacts): Un oggetto omogeneo appare con bordi più scuri e un centro più chiaro.

Non esiste una soluzione universale; la chiave è abbinare l’algoritmo al tipo di artefatto

Correzione di Errori ad Alta Frequenza (Pixel e Strisce)

Mira a rimuovere difetti localizzati e/o periodici:

Metodo di Correzione

Obiettivo

Meccanismo

Thresholding / Interpolazione Semplice

Rimozione di Dead/Hot Pixels.

Identifica i pixel “outlier” e sostituisce il loro valore con la mediana dei pixel vicini non difettosi.

Algoritmo di Vo (Filtraggio in Frequenza)

Rimozione di strisce periodiche.

Utilizza la Trasformata di Fourier (FFT): le strisce verticali generano un picco nello spettro che viene eliminato tramite un filtro “notch”.

Inpainting / Algoritmo di Titarenko

Correzione di strisce ampie o con intensità variabile.

Metodi statistici/iterativi che identificano le linee anomale e le “restaurano” interpolando dai dati circostanti.

Correzione della Sfocatura (Deconvoluzione)

Mira a invertire l’effetto del processo di sfocatura:

  • Filtro di Wiener (PSF Nota): Efficace per rimuovere sfocature note (es. sfocatura lineare da movimento o gaussiana da defocusing).
  • Deconvoluzione Cieca (Blind Deconvolution): Utilizzato quando la natura esatta della sfocatura (Point Spread Function, PSF) non è nota.
Correzione del Background Residuo (Errori a Bassa Frequenza)

Mira a correggere variazioni di intensità diffuse e non uniformi:

  • Rolling Ball (Metodo Morfologico): Obiettivo: Rimuovere un background di tipo additivo (es. un bagliore o offset di fondo).
  • Gaussiano / Superfici di Bézier (Metodo Moltiplicativo): Obiettivo: Rimuovere un background di tipo moltiplicativo (es. non uniformità di illuminazione o intensità a “cupola”).

4. Fase 3: Denoising e Sharpening

Dopo aver corretto gli artefatti sistematici, l’immagine è corretta, ma non ancora pulita. Può essere ancora affetta da rumore casuale (elettronico o statistico), che oscura i dettagli fini e complica le analisi successive come la segmentazione.

Esploriamo ora due operazioni complementari e in apparente conflitto: il Denoising (ridurre il rumore) e lo Sharpening (evidenziare i bordi).

1. Denoising: Smussare il Rumore, Preservare il Segnale

L’obiettivo è sopprimere il rumore senza distruggere i bordi e le texture reali dell’immagine.

Filtri Locali Semplici
  • Filtro Gaussiano: L’approccio classico. Sostituisce ogni pixel con una media pesata dei suoi vicini.
    • Pro: Molto efficace nel ridurre il rumore gaussiano.

Contro: Sfoca tutto, inclusi i bordi e i dettagli diagnostici. 

				
					
// Filtro Gaussiano
cv::Mat gaussianBlurred;
cv::GaussianBlur(inputImage, gaussianBlurred, cv::Size(5, 5), 0);

				
			
  • Filtro Mediano : è un filtro non lineare eccellente per la riduzione del rumore impulsivo (sale e pepe), mantenendo i dettagli dell’immagine
    • Pro: E’ stremamente efficace nel rimuovere picchi isolati di rumore (“sale e pepe”) e per sostituire pixel eccessivamente luminosi o scuri anomali (hot/dead pixels).
    • Contro:Tende a sfocare leggermente i dettagli minuti e le texture sottili ed è meno efficace contro il rumore gaussiano rispetto ad altri filtri.
				
					// Filtro Mediano
// 'image' deve essere 8-bit (CV_8U) per cv::medianBlur
cv::Mat img_8bit;
// Assumendo 'correctedImage' sia float (0-1) dall'esempio precedente o una CV_16U caricata
correctedImage.convertTo(img_8bit, CV_8U, 255.0);
cv::Mat medianFiltered;
// 'ksize' (3) deve essere un intero dispari.
// 3x3 è ideale per pixel singoli.
cv::medianBlur(img_8bit, medianFiltered, 3);
				
			
Filtri Edge-Preserving
  •  Filtro Bilaterale è un miglioramento sofisticato del filtro Gaussiano che utilizza una media pesata basata su due criteri fondamental: La Vicinanza Spazialeper cui i pixel più vicini al centro del calcolo ricevono un peso maggiore e la Somiglianza di Intensità dove I pixel con un valore cromatico o di intensità simile ricevono anch’essi un peso maggiore
    • Pro: Conservazione dei Bordi e Qualità Visiva Superiore
    • Contro: Complessità Computazionale; Selezione dei Parametri per il dominio spaziale e uno per il dominio di intensità può richiedere tentativi ed errori per ottimizzare il risultato; Introduzione di Artefatti se i parametri non sono scelti correttamente.
				
					// Filtro Bilaterale
cv::Mat bilateralFiltered;
cv::bilateralFilter(inputImage, bilateralFiltered, 9, 75, 75);

				
			
  • Non-Local Means (NLM): Sfrutta la ridondanza presente nell’immagine per il denoising. Per pulire un pixel, cerca “patch” simili in tutta l’immagine (approccio non-locale), non limitandosi all’area circostante. Il nuovo valore del pixel è una media pesata dei pixel centrali di tutte le patch simili trovate.
    • Pro: Denoising eccellente preservando le texture fini.
    • Contro: Alta complessità computazionale e lentezza. 
				
					// Non-Local Means (NLM)
// 1. Normalizza l'immagine in 8-bit (0-255)
cv::Mat image_8U;
cv::normalize(inputImage, image_8U, 0, 255, cv::NORM_MINMAX, CV_8U);
// 2. Applica NLM
cv::Mat nlmFiltered_8U;
cv::fastNlMeansDenoising(image_8U, nlmFiltered_8U, 10.0f, 7, 21);
				
			
Metodi Avanzati (Dominio della Trasformata)
  • Wavelet Denoising: Scompone l’immagine in diverse frequenze di dettaglio. L’immagine viene scomposta in coefficienti nel dominio wavelet. I coefficienti deboli (associati a rumore, basse frequenze) vengono azzerati o ridotti (soft-thresholding), mentre quelli forti (bordi, alte frequenze) vengono preservati. L’immagine viene poi ricostruita.
    • Pro: Eccezionale sul rumore additivo gaussiano, preserva benissimo i dettagli (bordi netti).
    • Contro: Può introdurre artefatti visivi se la soglia (threshold) non è impostata correttamente. Computationalmente più pesante rispetto a filtri semplici come il filtro media.
2. Sharpening: Evidenziare Bordi e Dettagli

Lo sharpening è l’opposto del denoising: mira a enfatizzare le alte frequenze (transizioni nette).

Filtro di Sobel (Basato sulla Derivata Prima): Il filtro di Sobel è un operatore discreto di differenziazione che approssima il gradiente dell’intensità dell’immagine. È primariamente impiegato per l’edge detection (rilevamento dei bordi), identificando i punti di massimo cambiamento di intensità.

Pro: Semplicità concettuale e rapidità di calcolo; fornisce sia l’intensità che l’orientamento del gradiente; incorpora un leggero effetto di smoothing che attenua il rumore.

Contro: Rimane suscettibile al rumore ad alta frequenza.I bordi rilevati sono spesso spessi (multi-pixel). Non è l’operatore più accurato per la localizzazione esatta del bordo (spesso si preferisce l’algoritmo di Canny).

				
					//  Filtro di Sobel (Mappa dei Bordi)
cv::Mat grad_x, grad_y;
cv::Mat abs_grad_x, abs_grad_y;
cv::Mat gradientMap;
cv::Sobel(inputImage, grad_x, CV_32F, 1, 0, 3);
cv::convertScaleAbs(grad_x, abs_grad_x); 
cv::Sobel(inputImage, grad_y, CV_32F, 0, 1, 3);
cv::convertScaleAbs(grad_y, abs_grad_y); 
cv::addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, gradientMap);

				
			

Filtro di Laplace (Basato sulla Derivata Seconda): è un operatore di derivata seconda utilizzato per l’individuazione dei bordi nelle immagini. Funziona misurando la “curvatura” o la rapidità di cambiamento dell’intensità di un pixel rispetto ai suoi vicini, rilevando così linee sottili e bruschi cambiamenti. Lo sharpening dell’immagine è ottenuto sottraendo il Laplaciano dall’immagine originale.

Pro: Sensibilità ai dettagli; semplice e veloce

Contro: Sensibilità al rumore  ad alta frequenza; A differenza del gradiente (derivate prime), non fornisce informazioni sulla direzione del bordo.

 

				
					// Sharpening con Filtro di Laplace
cv::Mat laplacianMap;
cv::Laplacian(inputImage, laplacianMap, CV_32F, 3); // ksize=3
cv::Mat sharpenedImage;
double strength = 0.5; // Coefficiente 'c'
cv::subtract(inputImage, laplacianMap * strength,sharpenedImage);

				
			

5. Fase 4: Miglioramento Visivo e Contrasto

Un’immagine quantitativamente ineccepibile (ad esempio, un’immagine a 16 bit, CV_16U), dopo le correzioni e i filtraggi, può risultare visivamente “piatta” o troppo scura. Questo fenomeno si verifica quando i dati rilevanti sono concentrati in un intervallo ristretto di livelli di grigio.

E’ allora necessario effettuare un’operazione di “stiramento” dell’istogramma. L’obiettivo è estendere la distribuzione dei pixel per sfruttare appieno la gamma dinamica disponibile sul dispositivo di visualizzazione (ad esempio, da 0 a 255).

Equalizzazione Globale dell’Istogramma (Histogram Equalization – HE)

Questo metodo tradizionale agisce sull’intera immagine per rimappare e ridistribuire le intensità dei pixel in modo uniforme.

  • Funzionamento: La tecnica mira a trasformare l’istogramma dell’immagine rendendolo il più uniforme (piatto) possibile. Il principio è che una distribuzione equa di tutti i livelli di grigio massimizza il contrasto complessivo.
  • Svantaggi: Essendo un’operazione che considera l’immagine nel suo complesso, aree ampie e poco variegate (come uno sfondo omogeneo) tendono a dominare l’istogramma. Questo può portare a “schiacciare” i dettagli presenti in regioni più piccole e, potenzialmente, ad amplificare notevolmente il rumore di fondo.

Equalizzazione Adattativa dell’Istogramma (CLAHE)

CLAHE rappresenta la soluzione “intelligente” e all’avanguardia per superare i limiti dell’equalizzazione globale, affermandosi come lo standard de-facto nell’imaging medicale.

Principio Fondamentale

A differenza dei metodi che analizzano l’istogramma complessivo, CLAHE opera localmente. Migliora il contrasto solo nelle aree necessarie, evitando al contempo l’amplificazione del rumore di fondo.

Processo Operativo (I 5 Passaggi)

  1. Suddivisione in Tessere (Tile Generation): L’immagine viene inizialmente suddivisa in una griglia di blocchi regionali di piccole dimensioni (le “tessere,” ad esempio 8×8).
  2. Calcolo degli Istogrammi Locali: Per ciascuna tessera viene calcolato un istogramma indipendente.
  3. Clipping dell’Istogramma (Il “CL” di CLAHE): Questa fase cruciale impone un “limite” (il Clip Limit). Qualsiasi livello di grigio (bin) che superi tale limite, spesso a causa della presenza di rumore, viene “tagliato.” L’eccesso risultante viene poi ridistribuito uniformemente sugli altri bin. Questo meccanismo previene efficacemente la sovra-amplificazione del rumore.
  4. Equalizzazione Adattiva: Viene applicata la classica equalizzazione (basata sulla funzione di distribuzione cumulativa – CDF) a ciascun istogramma locale che è stato “clippato.”
  5. Interpolazione per Fluidità: Per eliminare l’effetto visivo “a scacchiera” derivante dalla divisione in tessere, i valori finali dei pixel vengono calcolati tramite interpolazione bilineare tra le mappature delle tessere adiacenti, garantendo una transizione cromatica fluida e omogenea.
				
					// CLAHE
// Anche CLAHE lavora su immagini a 8 bit.
// Usiamo la 'image_8bit' normalizzata dall'esempio precedente.

// 1. Creare un oggetto CLAHE.
// clipLimit: Soglia per limitare il contrasto (il "CL"). Valori
//            bassi (es. 2.0-4.0) prevengono l'amplificazione
//            del rumore.
// tileGridSize: La dimensione della griglia (es. 8x8).
cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
clahe->setClipLimit(2.0);
clahe->setTileGridSize(cv::Size(8, 8));
// 2. Applicare CLAHE all'immagine 8-bit.
cv::Mat clahe_output;

				
			

I Giudici della Qualità: PSNR e SSIM

Valutazione della Qualità: L’Occhio del Matematico vs. L’Occhio del Radiologo

Abbiamo completato la nostra catena di elaborazione. Ora, come facciamo a sapere se il nostro risultato è “migliore”? Ci affidiamo a metriche quantitative che confrontano la nostra immagine elaborata con un’immagine di riferimento ideale (la ground truth).

1. PSNR (Peak Signal-to-Noise Ratio): il Matematico

Il PSNR è la metrica “classica” e puramente quantitativa.

  • Cosa Misura: La fedeltà numerica. Si basa sull’Errore Quadratico Medio (MSE), che calcola la differenza, pixel per pixel.
  • Obiettivo: Massimizzare il PSNR. Un PSNR più alto significa un MSE più basso (errore numerico minore).
2. SSIM (Structural Similarity Index): il Radiologo

L’SSIM è una metrica moderna e percettiva, progettata per imitare il modo in cui un essere umano (come un radiologo) giudica la qualità di un’immagine.

  • Cosa Misura: La somiglianza strutturale. L’SSIM riconosce che l’occhio umano è molto più bravo a percepire strutture e relazioni tra i pixel che a notare piccoli errori numerici.
  • Come funziona: Invece di confrontare singoli pixel, confronta piccole finestre (patch) di immagine, valutando tre componenti chiave:
    • Luminanza: Il livello medio di intensità è simile?
    • Contrasto: La varianza locale dei dettagli è simile?
    • Struttura: Il pattern dei pixel (quindi la loro correlazione) è simile?
  • Obiettivo: Massimizzare l’SSIM (il cui valore va da -1 a 1, dove 1 è identità perfetta).

Conclusione: Il Trade-Off Diagnostico

Qui sta il punto cruciale dell’intero imaging scientifico:

Un PSNR alto non significa sempre un’immagine diagnosticamente migliore.

Immaginiamo un filtro di denoising molto aggressivo (es. un forte blur Gaussiano). Questo filtro “spalma” il rumore, riducendo drasticamente l’errore numerico (l’MSE) e portando a un PSNR altissimo.

Tuttavia, nel processo, quel filtro ha anche “spalmato” una micro-lesione o una linea di frattura sottile. Ha distrutto la struttura.

  • PSNR: Alto (il matematico è felice, l’errore medio è basso).
  • SSIM: Basso (il radiologo è scontento, il dettaglio strutturale è perso).
  • Valore Diagnostico: Nullo.

Il vero obiettivo dello sviluppo di algoritmi (come NLM o Wavelet Denoising) non è massimizzare ciecamente il PSNR, ma trovare il perfetto trade-off: un algoritmo che riduca il rumore (aumentando il PSNR) preservando al contempo i dettagli critici (mantenendo alto l’SSIM).

Dalla generazione del fotone nel vuoto alla valutazione statistica finale, l’immagine radiografica perfetta è quindi il risultato di una catena in cui fisica, ingegneria e informatica collaborano per rendere visibile l’invisibile.

Ultimi articoli

Rendere i metadata DICOM leggibili per gli sviluppatori
Agents and code
Agentic Coding
Deep machine learning
Deep machine learning: cos’è, differenze con il machine learning e applicazioni pratiche

area contatti

Per informazioni, progetti, idee, scrivici