// TOOL

Image Processing Lab

Tre strumenti di elaborazione immagini in uno: applica kernel di convoluzione, esplora il demosaicing di un sensore Bayer e analizza istogramma ed esposizione — su un’immagine tua o di esempio. Strumento dimostrativo, nato dal nostro lavoro su sensori CMOS e pipeline camera embedded.

Strumento image processing lab

1 · Immagine

Kernel 3×3
Originale
Risultato

Tre operazioni, una pipeline

I tre moduli di questo strumento non sono scollegati: sono tre tappe della pipeline che trasforma la luce in un’immagine utilizzabile. Un sensore CMOS cattura un mosaico Bayer grezzo (modulo Demosaic); il demosaicing lo converte in RGB; poi filtri di convoluzione riducono il rumore o esaltano i dettagli (modulo Convoluzione); infine si controlla istogramma ed esposizione per capire se la scena è stata catturata correttamente (modulo Istogramma). Sono gli stessi passaggi che governano la qualità di una camera embedded.

Cos’è la convoluzione 2D?

La convoluzione fa scorrere una piccola matrice di pesi — il kernel — su ogni pixel: il nuovo valore è la somma pesata del pixel e dei suoi vicini. È l’operazione di base di quasi ogni filtro spaziale e dei primi strati di una rete convoluzionale. I tre canali R, G e B vengono filtrati separatamente; il canale alfa resta invariato.

La convoluzione fa scorrere una piccola matrice di pesi — il kernel — su ogni pixel: il nuovo valore di un pixel è la somma pesata di sé e dei suoi vicini. È l’operazione di base di quasi ogni filtro spaziale e dei primi strati di una rete convoluzionale. Con un kernel K di lato dispari (3×3, 5×5…) e un’immagine I, il pixel di uscita in (x, y) vale:

dove a = (lato−1)/2. I tre canali R, G e B vengono filtrati separatamente; il canale alfa resta invariato.

Quali sono i kernel principali?

L’identità lascia l’immagine invariata; box e Gaussian blur mediano il vicinato riducendo rumore e dettaglio; lo sharpen amplifica il contrasto locale; il Laplaciano e i Sobel X/Y rispondono alle derivate ed evidenziano i contorni; l’emboss simula un rilievo illuminato di lato. I kernel a somma zero non si normalizzano: si aggiunge un offset di 128 per renderli visibili.

  • Identit\u00e0 \u2014 centro 1, tutto il resto 0: l\u2019immagine non cambia. \u00c8 il punto di partenza per costruire un kernel personalizzato.
  • Box blur / Gaussian blur \u2014 pesi tutti positivi che mediano il vicinato: riducono rumore e dettaglio. Il gaussiano pesa di pi\u00f9 il centro (pesi 1\u20132\u20131 / 1\u20134\u20136\u20134\u20131) e sfoca in modo pi\u00f9 naturale del box.
  • Sharpen \u2014 centro alto e bordi negativi: amplifica il contrasto locale, esaltando i dettagli. \u00c8 un \u201cunsharp\u201d in forma di kernel.
  • Edge detect (Laplaciano) \u2014 somma zero, risponde alla derivata seconda: evidenzia i contorni in ogni direzione.
  • Sobel X / Sobel Y \u2014 gradiente direzionale (derivata prima): rileva i bordi verticali o orizzontali. La radice della somma dei quadrati dei due d\u00e0 il modulo del gradiente, base del rilevamento dei contorni.
  • Emboss \u2014 kernel asimmetrico che simula un rilievo illuminato di lato, trasformando i bordi in un effetto a sbalzo.

Bordi e normalizzazione

Sui bordi dell’immagine il kernel sborda: qui le coordinate vengono “clampate”, cioè si estende il pixel di bordo (esistono anche modalità a specchio o periodiche). La normalizzazione divide il risultato per la somma dei coefficienti, così un blur preserva la luminanza media. I kernel a somma zero (edge, Sobel) non si normalizzano: per renderli visibili si aggiunge un offset (qui 128), che porta lo zero al grigio medio.

Cos’è il sensore Bayer?

Un sensore CMOS a colori non misura RGB in ogni pixel: davanti ai fotositi c’è una matrice di filtri colore (CFA) disposta secondo il pattern Bayer, una griglia 2×2 con due verdi, un rosso e un blu. I verdi sono il doppio perché l’occhio è più sensibile al verde. RGGB, BGGR, GRBG e GBRG sono le quattro fasi possibili.

Un sensore CMOS a colori non misura RGB in ogni pixel. Davanti ai fotositi c’è una matrice di filtri colore (CFA, Color Filter Array) disposta secondo il pattern Bayer: una griglia 2×2 che si ripete, con due verdi e un rosso e un blu. I verdi sono il doppio perché l’occhio umano è più sensibile al verde, che porta gran parte dell’informazione di luminanza. RGGB, BGGR, GRBG e GBRG sono le quattro fasi possibili dello stesso schema: cambia solo il pixel da cui parte la griglia.

Demosaicing: nearest e bilineare

Poiché ogni pixel registra un solo canale, i due mancanti vanno ricostruiti interpolando i vicini dello stesso colore: è il demosaicing. Il nearest neighbor copia il campione più vicino — velocissimo, ma con scalettature e blocchi 2×2 visibili. Il bilineare media i vicini dello stesso colore — più morbido, ma sui bordi netti può generare due artefatti tipici: lo zipper (effetto a zig-zag lungo i contorni) e il color fringing (frange colorate). Gli algoritmi che usano davvero le fotocamere sono più sofisticati: invece di mediare alla cieca, riconoscono la direzione dei contorni e interpolano lungo i bordi anziché attraverso, riducendo questi artefatti.

Istogramma e luma

L’istogramma conta quanti pixel cadono in ciascun livello (0–255), separatamente per i tre canali e per la luma. La luma Y′ combina i canali coi pesi Rec.601 sui valori COSÌ COME STANNO nel file, cioè gamma-encoded: non è la luminanza fotometrica, che richiede prima di linearizzare i canali. Sul rosso puro la differenza vale 51 livelli su 255.

Un addensamento a sinistra indica una scena scura, a destra una chiara; una distribuzione che usa tutta la scala segnala un buon contrasto.

Esposizione e clipping

Quando l’istogramma si schiaccia contro 0 o 255 c’è clipping: il dettaglio nelle ombre o nelle alte luci è perso e non si recupera in post. Gli indicatori del modulo riportano la percentuale di pixel in clipping di ombre e alte luci: è il controllo che si fa in fase di acquisizione per impostare correttamente esposizione e guadagno del sensore, prima ancora di elaborare l’immagine.

Dal campo al codice

Questi non sono esercizi astratti: sono i mattoni della messa a punto di una camera embedded. Nel nostro lavoro su sensori CMOS — dal bring-up di un sensore a livello di registri all’analisi del flusso video — leggere un istogramma, valutare il demosaicing e applicare un filtro di nitidezza o di riduzione del rumore sono operazioni quotidiane. Lo strumento da cui nasce questo tool (vedi il repo correlato) serve proprio a portare in vita un sensore e a ispezionarne l’immagine.

Quali sono i limiti dello strumento?

È uno strumento dimostrativo: gli algoritmi (demosaicing bilineare, kernel base) sono didattici, non quelli di un ISP reale. L’immagine viene ridimensionata per mantenere fluida l’elaborazione. Si lavora sempre su dati già demosaicizzati e compressi (JPEG/PNG): il mosaico Bayer è simulato dall’RGB, non un RAW di sensore. La convoluzione è a precisione intera 8-bit con clamp. Il kernel è applicato senza inversione degli indici, quindi l’operazione è formalmente una cross-correlazione: è la convenzione dell’image processing, e sui kernel simmetrici i due risultati coincidono. Sui kernel antisimmetrici cambia il segno del gradiente — con Sobel, bordi chiari e scuri si invertono. Per una convoluzione vera si ruota il kernel di 180°.

  • Strumento dimostrativo: gli algoritmi (demosaicing bilineare, kernel base) sono didattici, non quelli di un ISP reale.
  • L\u2019immagine viene ridimensionata per mantenere fluida l\u2019elaborazione; le immagini molto grandi perdono dettaglio.
  • Si lavora sempre su dati gi\u00e0 demosaicizzati e compressi (JPEG/PNG): il mosaico Bayer \u00e8 simulato dall\u2019RGB, non un RAW di sensore.
  • La convoluzione \u00e8 a precisione intera 8-bit con clamp; non sostituisce un\u2019elaborazione in virgola mobile a precisione piena.

Approfondisci: wiki Image processing →