El procesado de imagen es bastante simple pero funciona. Consiste en identificar cuántos píxeles sobrepasan un umbral de ruido de referencia; si los hay, se genera una máscara binaria que se extiende a los píxeles adyacentes mediante una operación de dilatación, y finalmente se etiquetan las regiones contiguas como candidatos a evento.
La función mask_image
int ccdRadiationDetector::mask_image(
const cimg_library::CImg<float> &noisedata,
const cimg_library::CImg<float> &badchannels,
cimg_library::CImg<float> &frame,
float noise_sigmas,
mapcounter_t &badchannel_counter)
{
int counter = 0;
cimg_library::CImg<float> imgretval(frame);
imgretval.fill(0);
cimg_foroff(frame, off)
{
const float value = frame(off);
const float noiselevel = noise_sigmas * noisedata(off);
const int badchannel = badchannels(off);
if (badchannel)
continue; // Ignorar canales defectuosos
if (value > noiselevel) {
imgretval(off) = 1; // Píxel por encima del umbral → señal
counter++;
}
}
frame.swap(imgretval);
if (counter) {
frame.dilate(6, 6); // Extender la máscara a píxeles vecinos
frame.label(); // Etiquetar regiones contiguas
}
return counter;
}
Pasos del algoritmo
1. Umbral por píxel
Para cada píxel, comparamos su valor con noise_sigmas × ruido_de_referencia. El parámetro noise_sigmas controla la sensibilidad del detector — nosotros hemos usado valores entre 6.5 y 8. Un umbral más bajo captura más eventos pero aumenta los falsos positivos por ruido electrónico.
2. Máscara binaria
Los píxeles que superan el umbral se marcan con 1 en la imagen de retorno. Los canales marcados como badchannels en la calibración se ignoran.
3. Dilatación
frame.dilate(6, 6) extiende la máscara 6 píxeles en cada dirección. Esto asegura que todos los píxeles adyacentes a uno con señal queden incluidos en el mismo cluster, aunque no superen individualmente el umbral. Así se captura la deposición total de energía del evento.
4. Etiquetado
frame.label() asigna un identificador único a cada región contigua de píxeles activos. A partir de ahí se puede sumar la energía depositada en cada cluster e incrementar el histograma.
El histograma de energía
Cada evento identificado contribuye al histograma con la suma de valores de sus píxeles. Como los valores van de 0 a 255 y un evento puede afectar hasta 12 píxeles (4 píxeles × 3 canales RGB), el rango útil del histograma es 0–3000 unidades ADC.
La forma de ese histograma — que recuerda a una distribución de Landau — es la firma física del experimento. Ver Hazlo tú mismo para la comparación con la curva teórica del PDG.
Máscara de canales defectuosos (badchannels)
El sensor tiene píxeles que generan señal de forma sistemática independientemente de la radiación. Estos se identifican durante la calibración y se marcan en _badchannels. La función mask_image los salta con if (badchannel) continue, evitando falsos positivos recurrentes.
Continúa en Frameworks y herramientas para instalar las dependencias necesarias para compilar el código.