PDI+VC · Ejercicio de Programación

EP03_10 — ✨ Unsharp Masking (USM)

3.12.10 EP03_10 ✨ Unsharp Masking (USM)

En los sistemas de digitalización de documentos históricos y obras de arte, la nitidez de las imágenes es fundamental para la lectura de textos manuscritos y detalles ornamentales. El Unsharp Masking (USM) es el algoritmo de realce de nitidez estándar utilizado en escáneres profesionales y software como Adobe Photoshop, controlado por el parámetro \(k\) que determina la intensidad del realce.

Ver en la Figura 3.35 una simulación de este EP.

3.12.10.1 📋 Directrices de Implementación

  1. Dimensiones: Leer los enteros \(L\) (líneas) y \(C\) (columnas).
  2. Parámetro: Leer el valor real \(k\) (intensidad del realce, \(k \ge 0\)).
  3. Datos: Leer la matriz de píxeles \(f\).
  4. Suavizado: Calcular \(\bar{f}\) con el filtro de promedio \(3\times3\) (solo píxeles internos; bordes mantenidos):

\[\bar{f}(i,j) = \frac{1}{9} \sum_{s=-1}^{1} \sum_{t=-1}^{1} f(i+s, j+t)\]

  1. Máscara de alta frecuencia: \(m(i,j) = f(i,j) - \bar{f}(i,j)\).
  2. Realce USM: Para cada píxel interno:

\[g(i,j) = \text{clip}\left(\text{round}\left(f(i,j) + k \cdot m(i,j)\right)\right)\]

  1. Borde: \(g(i,j) = f(i,j)\) (copia directa).
  2. Salida: Mostrar la matriz realzada \(L \times C\).

3.12.10.2 📌 Restricciones Computacionales

  • Redondeo: Aplicar round antes del clip.
  • Saturación: \(\text{clip}(x) = \max(0, \min(255, x))\).
  • Operaciones en float: Calcular \(\bar{f}\) y \(m\) en punto flotante antes de redondear el resultado final.
  • \(k = 0\): Sin realce — la salida es idéntica a la entrada (excepto en los bordes).

3.12.10.3 🧠 Fundamentación Teórica

Etapa Operación Descripción
1 \(\bar{f} = f * \frac{1}{9}\mathbf{1}_{3\times3}\) Suavizado (bajas frecuencias)
2 \(m = f - \bar{f}\) Máscara (altas frecuencias)
3 \(g = \text{clip}(\text{round}(f + k \cdot m))\) Realce ponderado

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

Entrada:

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

Salida:

  • Matriz realzada \(L \times C\).

3.12.10.5 📌 Ejemplos

Entrada Salida Observación
3
3
0.0
100 100 100
100 100 100
100 100 100
100 100 100
100 100 100
100 100 100
k=0: sin realce
3
3
1.0
50 50 50
50 200 50
50 50 50
50 50 50
50 255 50
50 50 50
k=1: píxel central realzado y saturado
✨ Simulador EP03_10: Enmascaramiento Unsharp (USM) g = f + k · m

Ajusta el factor de ganancia k, observa el pipeline completo de realce (desenfoque, máscara de alta frecuencia) y pasa el mouse sobre el resultado.

Factor de ganancia k: k = 1.0
① Imagen Original f Matriz 5×5 píxeles
② Desenfocado f̄ Promedio 3 × 3
③ Máscara m m = f − f̄ (Altas Frecuencias)
④ Resultado g = f + 1.0·m Pasa el mouse para inspeccionar
Leyenda:
Vecindario 3×3
Píxel Central
Borde (Copiado)
Máscara Positiva/Negativa
Pasa el mouse sobre un píxel interno del resultado para rastrear el pipeline completo.
Figura 3.35: Simulador EP03_10: Máscara de enfoque (USM)
%%writefile EP03_10.cpp
// your solution
Overwriting EP03_10.cpp
TestSuite("EP03_10.cpp").run()
✔️ EP03_10.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP03_10.cases

🔍 Probando C++: EP03_10.cpp
⚠️ EP03_10.cpp: archivo vacío (menos de 3 líneas). Pruebas omitidas.