PDI+VC · Ejercicio de Programación

EP04_02 — 📊 Umbralización Automática de Otsu

4.20.2 EP04_02 📊 Umbralización Automática de Otsu

Elegir manualmente el umbral \(T\) funciona cuando la iluminación es estable, pero en microscopía digital y en inspección de láminas de sangre, cada muestra tiene un contraste diferente — un umbral fijo fallaría de imagen en imagen. El método de Otsu resuelve esto encontrando, por sí solo, el umbral que maximiza la separación estadística entre las dos clases de píxeles, haciendo la segmentación automática y adaptativa. Ver en Figura 4.31 una simulación de este EP.

4.20.2.1 📋 Directrices de Implementación

  1. Dimensiones: Leer los enteros \(L\) (filas) y \(C\) (columnas).

  2. Datos: Leer los valores enteros de la matriz original fila por fila.

  3. Histograma: Construir el histograma \(h[i]\), \(i=0,\dots,255\), contando cuántos píxeles tienen valor \(i\).

  4. Búsqueda del umbral: Para cada candidato \(T\) de \(1\) a \(255\), calcular la varianza entre clases: \[ \sigma_B^2(T) = \frac{n_0 \cdot n_1}{N^2}\,(m_0 - m_1)^2 \] donde \(n_0,n_1\) son las cantidades de píxeles con valor \(<T\) y \(\geq T\), \(m_0,m_1\) son sus medias, y \(N=L\times C\).

  5. Elección: El umbral óptimo \(T^*\) es el que maximiza \(\sigma_B^2(T)\) (en caso de empate, mantener el primero encontrado).

  6. Aplicación: Binarizar la imagen usando \(T^*\), aplicando: \[ p' = \begin{cases} 255, & \text{si } p > T^* \\ 0, & \text{si } p \le T^* \end{cases} \]

4.20.2.2 📌 Restricciones Computacionales

  • Candidatos válidos: Ignorar \(T\) que deje \(n_0=0\) o \(n_1=0\) (clase vacía).
  • Empate: Mantener siempre el primer \(T\) que alcanzó el valor máximo de \(\sigma_B^2\).
  • Tipo: \(T^*\) y la matriz de salida deben ser enteros.
  • Convención OpenCV: La binarización sigue cv2.THRESL_BINARY; los píxeles con valor exactamente igual a \(T^*\) se vuelven negros.

4.20.2.3 🧠 Fundamentación Teórica

Concepto Significado Impacto
\(\sigma_B^2(T)\) alta Clases bien separadas en \(T\) \(T\) es un buen candidato a umbral
Histograma bimodal Dos “picos” distintos Otsu encuentra el valle entre ellos
Histograma unimodal Un único “pico” Otsu aún elige algún \(T\), pero la segmentación es poco fiable

4.20.2.4 📦 Especificación de Entrada y Salida (VPL)

Entrada:

  • Línea 1: Entero \(L\).
  • Línea 2: Entero \(C\).
  • Líneas siguientes: Elementos enteros de la matriz original.

Salida:

  • Matriz binarizada en \(L\) filas y \(C\) columnas, valores \(0\) o \(255\).

4.20.2.5 📌 Ejemplos

Entrada Salida Observación
4
4
12 12 12 200
12 12 200 200
12 200 200 200
200 200 200 200
0 0 0 255
0 0 255 255
0 255 255 255
255 255 255 255
Histograma bimodal claro: 12 y 200
1
2
10 250
0 250 Solo dos valores: \(T^*\) queda en el mayor
📊 Simulador EP04_02: Otsu Automático T* = argmax σ²_B(T)

👆 Clic izquierdo oscurece (−25) y clic con el botón derecho aclara (+25) los píxeles de la entrada. Observe el umbral óptimo T* ajustarse dinámicamente al histograma.

T* = −

Entrada Original (Clicable)
Resultado Otsu (p')
Figura 4.31: Simulador EP04_02: Limiarización Automática de Otsu (T* = argmax σ²_B(T))
%%writefile EP04_02.py
# Código Python
Overwriting EP04_02.py
TestSuite("EP04_02.py").run()
✔️ EP04_02.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP04_02.cases

🔍 Probando Python: EP04_02.py
⚠️ EP04_02.py: archivo vacío (menos de 3 líneas). Pruebas omitidas.