PDI+VC · Ejercicio de Programación

EP03_08 — 🧭 Gradiente de Sobel: Gx y Gy

3.12.8 EP03_08 🧭 Gradiente de Sobel: Gx y Gy

En robots exploradores de Marte (como el Perseverance), la detección de obstáculos se realiza en tiempo real mediante cámaras estereoscópicas. El operador de Sobel calcula el gradiente direccional de la escena y se utiliza en el algoritmo de detección de bordes para identificar rocas, fisuras y desniveles del terreno que puedan comprometer la navegación.

Ver en Figura 3.33 una simulación de este EP.

3.12.8.1 📋 Directrices de Implementación

  1. Dimensiones: Leer los enteros \(L\) (filas) y \(C\) (columnas).
  2. Datos: Leer la matriz \(f\).
  3. Gx y Gy: Para cada píxel interno \((i,j)\) con \(1 \le i < L-1\), \(1 \le j < C-1\):

\[G_x(i,j) = [f(i-1,j+1) + 2f(i,j+1) + f(i+1,j+1)] - [f(i-1,j-1) + 2f(i,j-1) + f(i+1,j-1)]\]

\[G_y(i,j) = [f(i+1,j-1) + 2f(i+1,j) + f(i+1,j+1)] - [f(i-1,j-1) + 2f(i-1,j) + f(i-1,j+1)]\]

  1. Magnitud: \(|\nabla f(i,j)| = \text{clip}(\text{round}(\sqrt{G_x^2 + G_y^2}))\).
  2. Borde: Los píxeles de borde reciben magnitud 0.
  3. Salida: Mostrar la magnitud \(L \times C\).

3.12.8.2 📌 Restricciones Computacionales

  • Redondeo: Aplicar round antes de convertir a entero.
  • Saturación: \(\text{clip}(x) = \max(0, \min(255, x))\).
  • Raíz cuadrada: Usar \(\sqrt{G_x^2 + G_y^2}\) (no la aproximación \(|G_x| + |G_y|\)).

3.12.8.3 🧠 Fundamentación Teórica

Operador Detecta Coeficientes diagonales
\(G_x\) Bordes verticales \(\pm 1\)
\(G_y\) Bordes horizontales \(\pm 1\)
\(|\nabla f|\) Todos los bordes Combinado

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

Entrada:

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

Salida:

  • Magnitud del gradiente, matriz \(L \times C\).

3.12.8.5 📌 Ejemplos

Entrada Salida Observación
3
3
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
Imagen nula: gradiente cero
3
3
0 0 255
0 0 255
0 0 255
0 0 0
0 255 0
0 0 0
Borde vertical central: Gx alto
🧭 Simulador EP03_08: Gradiente de Sobel (Gx y Gy) |∇f| = √(Gx² + Gy²)

Analice la descomposición horizontal (Gx) y vertical (Gy) del operador de Sobel y pase el mouse sobre los píxeles de la magnitud para inspeccionar la vecindad 3×3.

Kernels de Sobel:
−1
0
+1
−2
0
+2
−1
0
+1
Gx
−1
−2
−1
0
0
0
+1
+2
+1
Gy
Imagen Original f Matriz 5×5 píxeles
Magnitud |∇f| √(Gx² + Gy²)
Gx — Gradiente Horizontal Azul = Negativo · Blanco = Cero · Azul Vivo = Positivo
Gy — Gradiente Vertical Ámbar = Negativo · Blanco = Cero · Ámbar Vivo = Positivo
Leyenda:
Vecindad 3×3 Inspeccionada
Píxel Central
Borde (Forzado a 0)
Pase el mouse sobre un píxel interno de la magnitud para ver la descomposición Gx y Gy.
Figura 3.33: Simulador EP03_08: Gradiente de Sobel (Gx y Gy)
%%writefile EP03_08.cpp
// your solution
Overwriting EP03_08.cpp
TestSuite("EP03_08.cpp").run()
✔️ EP03_08.cases ya existe en casos/
📋 5 caso(s) cargado(s) de casos/EP03_08.cases

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