Saltar al contenido principal

Gradientes en imagen

info

Todo el código de ejemplo se encuentra en Google Colab para su ejecución directa. Si no puedes ejecutar OpenCV localmente, puedes usar Google Colab junto con matplotlib para visualizar imágenes. Además la imagen que se utilizará en los ejemplos son imagen.png.

Objetivo

  • Aprender a calcular y visualizar gradientes en imágenes para la detección de bordes y transiciones de intensidad.
  • Explorar los operadores Sobel y Laplaciano, que permiten encontrar cambios bruscos en los niveles de gris, los cuales suelen corresponder a los bordes de los objetos en la escena.

Conceptos clave

  • Gradiente: mide el cambio en intensidad de los píxeles. Donde hay cambios fuertes, normalmente hay un borde.
  • Derivadas en imágenes: se aproximan mediante filtros (kernels) que resaltan variaciones en direcciones específicas.
  • Sobel: combina suavizado con derivadas, calculando gradientes en dirección X y Y.
  • Laplaciano: calcula la segunda derivada, resaltando zonas de cambio rápido en todas direcciones.
  • Bordes: regiones donde la intensidad varía abruptamente; esenciales para segmentación y reconocimiento de objetos.

Funciones principales en OpenCV

  • cv.Sobel(src, ddepth, dx, dy, ksize): Calcula el gradiente de la imagen en dirección X o Y según los valores de dx y dy.
  • cv.Laplacian(src, ddepth): Calcula la segunda derivada de la imagen, resaltando cambios bruscos de intensidad.

Teoría

La detección de bordes mediante gradientes se basa en derivadas:

  • La primera derivada indica dónde cambia la intensidad (pendientes altas → posible borde).
  • La segunda derivada indica dónde ocurre un cambio de pendiente (cero cruces → ubicación precisa de borde).

En imágenes digitales se usan kernels de convolución para aproximar estas derivadas.

  • Sobel aplica una máscara en X y otra en Y, combinando detección de bordes con un ligero suavizado para reducir ruido.
  • Laplaciano utiliza una sola máscara que responde a cambios en todas direcciones, siendo más sensible al ruido.
img con operación morfológica

Figura 1: Imagen original vs. Sobel vs. Laplaciano.

Sobel

El operador Sobel combina suavizado y derivadas de primer orden para calcular gradientes en dirección X e Y. Esto permite detectar bordes verticales y horizontales de manera eficiente, reduciendo el ruido al mismo tiempo. Se usa comúnmente cuando se necesita infromación direccional sobre los bordes.

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('sudoku.jpg', cv.IMREAD_GRAYSCALE)

sobelx = cv.Sobel(
img, # Imagen de entrada
cv.CV_64F, # Profundidad de la imagen de salida
1, # Orden de la derivada en x
0, # Orden de la derivada en y
ksize=5) # Tamaño del kernel

sobely = cv.Sobel(
img, # Imagen de entrada
cv.CV_64F, # Profundidad de la imagen de salida
0, # Orden de la derivada en x
1, # Orden de la derivada en y
ksize=5) # Tamaño del kernel

# Generar los plots de la imagen
plt.subplot(1,3,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,2),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(1,3,3),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])

plt.show()

Laplaciano

El operador Laplaciano calcula la segunda derivada de la imagen, resaltando cambios bruscos de intensidad en todas las direcciones. Es muy sensible a los bordes, pero también al ruido, por lo que a menudo se combina con un suavizado previo. Permite localizar con precisión la posición de los bordes sin importar su orientación.

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('sudoku.jpg', cv.IMREAD_GRAYSCALE)

laplacian = cv.Laplacian(
img, # Imagen de entrada
cv.CV_32F) # Profundidad de la imagen de salida

# Profundidad posible de la imagen de salida (ddepth):
# cv.CV_8U → 8 bits sin signo (0–255)
# cv.CV_16U → 16 bits sin signo
# cv.CV_16S → 16 bits con signo (puede tener valores negativos)
# cv.CV_32F → 32 bits en coma flotante
# cv.CV_64F → 64 bits en coma flotante (la más usada en gradientes para evitar pérdida de datos)

# Generar los plots de la imagen
plt.subplot(1,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1,2,2),plt.imshow(laplacian,cmap = 'gray')w
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])

plt.show()