Inicio > Cursos > Computer Vision con Python > Operaciones Morfologicas
Computer Vision con PythonFundamentos de VisionLección 4 de 12

Operaciones Morfologicas

Las operaciones morfologicas modifican la forma de objetos en imagenes binarias (blanco/negro). Usan un kernel (elemento estructurante) que se desliza sobre la imagen.

Operaciones basicas: • Erosion: encoge objetos blancos, elimina ruido pequeno • Dilatacion: expande objetos blancos, rellena huecos pequenos • Opening (erosion + dilatacion): elimina ruido sin afectar mucho la forma • Closing (dilatacion + erosion): rellena huecos internos sin expandir • Gradient (dilatacion - erosion): extrae el contorno del objeto • Top Hat (original - opening): extrae detalles brillantes pequenos • Black Hat (closing - original): extrae detalles oscuros pequenos

import cv2
import numpy as np

img = cv2.imread("documento.jpg", cv2.IMREAD_GRAYSCALE)
_, binaria = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

# Elemento estructurante (kernel)
kernel_3 = np.ones((3, 3), np.uint8)
kernel_5 = np.ones((5, 5), np.uint8)
kernel_elipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))

# Operaciones basicas
erosion = cv2.erode(binaria, kernel_3, iterations=1)
dilatacion = cv2.dilate(binaria, kernel_3, iterations=1)

# Operaciones compuestas con morphologyEx
opening = cv2.morphologyEx(binaria, cv2.MORPH_OPEN, kernel_5)
closing = cv2.morphologyEx(binaria, cv2.MORPH_CLOSE, kernel_5)
gradient = cv2.morphologyEx(binaria, cv2.MORPH_GRADIENT, kernel_3)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel_5)

# Caso practico: limpiar mascara de segmentacion
def limpiar_mascara(mask):
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
    # Opening: eliminar puntos blancos sueltos (ruido)
    limpia = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    # Closing: rellenar agujeros dentro de objetos
    limpia = cv2.morphologyEx(limpia, cv2.MORPH_CLOSE, kernel)
    return limpia

# Separar objetos pegados
def separar_objetos(binaria):
    dist = cv2.distanceTransform(binaria, cv2.DIST_L2, 5)
    _, markers = cv2.threshold(dist, 0.5 * dist.max(), 255, 0)
    return np.uint8(markers)
ConsejoEl tamano del kernel importa: grande = efecto mas agresivo. Un kernel de 3x3 limpia ruido fino, uno de 7x7 rellena huecos grandes. Usa getStructuringElement con MORPH_ELLIPSE para resultados mas naturales que un cuadrado.
← Histogramas y Mejora de ContrasteContornos y Analisis de Formas →

Practica esta lección

Resuelve los ejercicios del curso de Computer Vision con Python en la app, gratis y con corrección automática.

Empezar a practicar