Skip to content

Repository files navigation

Prácticas de OpenCV - Procesamiento de Imágenes y Reconocimiento de Placas

Proyecto completo de prácticas para aprender procesamiento de imágenes usando OpenCV en Python, incluyendo fundamentos básicos y reconocimiento de placas vehiculares.

📋 Tabla de Contenidos


📖 Descripción General

Este repositorio contiene dos prácticas completas de procesamiento de imágenes con OpenCV:

1. Práctica Básica (openCV.py)

Introducción a los fundamentos de procesamiento de imágenes:

  • Lectura de imágenes a color y escala de grises
  • Aclarado de imágenes
  • Reducción de ruido con diferentes filtros
  • Ajuste de brillo y contraste
  • Visualización de matrices de píxeles
  • Estadísticas de imágenes

2. Práctica de Reconocimiento de Placas (practica_reconocimiento_placas.py)

Sistema interactivo completo para detección de placas vehiculares:

  • 8 preguntas guiadas sobre procesamiento de imágenes
  • Pipeline completo de detección de placas
  • Filtros espaciales (pasa-alta y pasa-baja)
  • Ecualización de histogramas
  • Detección de bordes con Canny
  • Generación de reportes PDF profesionales

💻 Requisitos del Sistema

  • Python: 3.7 o superior
  • Sistema Operativo: Windows, macOS o Linux
  • Espacio en disco: ~100 MB (incluyendo dependencias)

🚀 Instalación

Sigue estos pasos para configurar el entorno de trabajo:

Paso 1: Clonar el repositorio

git clone git@github.com:ddeepdev/masterIA-openCV1.git
cd openCVClass

Paso 2: Crear entorno virtual

En macOS/Linux:

python3 -m venv .venv
source .venv/bin/activate

En Windows:

python -m venv .venv
.venv\Scripts\activate

Deberías ver (.venv) al inicio de tu línea de comandos, indicando que el entorno está activo.

Paso 3: Instalar dependencias

pip install -r requirements.txt

Esto instalará:

  • opencv-contrib-python>=4.8.0 - Biblioteca principal de procesamiento de imágenes
  • numpy>=1.24.0 - Operaciones matriciales y numéricas
  • matplotlib>=3.7.0 - Visualización de gráficos e imágenes
  • python-docx>=1.1.0 - Lectura de documentos Word
  • reportlab>=4.0.0 - Generación de reportes PDF

Paso 4: Verificar instalación

python -c "import cv2; print(f'OpenCV version: {cv2.__version__}')"

Deberías ver algo como: OpenCV version: 4.8.0 o superior.


📁 Estructura del Proyecto

openCVClass/
│
├── .venv/                          # Entorno virtual (generado)
├── .gitignore                      # Archivos ignorados por Git
├── README.md                       # Este archivo
├── requirements.txt                # Dependencias del proyecto
│
├── openCV.py                       # 🔵 PRÁCTICA 1: Fundamentos básicos
├── practica_reconocimiento_placas.py  # 🟢 PRÁCTICA 2: Reconocimiento de placas
│
├── img/                            # Directorio de imágenes de prueba
│   ├── pruebaQR.png               # Imagen para práctica básica
│   ├── pruebaImg2.png             # Imagen para práctica básica
│   └── CochesVarios/              # Imágenes de coches para reconocimiento
│       ├── Cars96.png
│       ├── Cars3.png
│       ├── Cars11.png
│       ├── coche11.jpeg
│       ├── coche14.jpeg
│       ├── coche16.jpeg
│       └── ... (más imágenes)
│
├── reporte/                        # 📄 PDFs generados (se crea automáticamente)
│   └── reporte_practica_YYYYMMDD_HHMMSS.pdf
│
└── mexmiart02_act2_auto1.docx     # Documento con las preguntas de la práctica

🔵 Práctica 1: Fundamentos de OpenCV

Archivo: openCV.py

Script básico para aprender los fundamentos de procesamiento de imágenes.

¿Qué hace este script?

Procesa una imagen aplicando diferentes transformaciones y muestra 10 ventanas con los resultados:

  1. Imagen original a color - Imagen sin modificar en BGR
  2. Imagen en escala de grises - Conversión a 1 canal
  3. Imagen en grises aclarada - Suma de valor constante
  4. Filtro Gaussiano - Suavizado para reducir ruido
  5. Filtro de Mediana - Elimina ruido "salt and pepper"
  6. Filtro Bilateral - Reduce ruido preservando bordes
  7. Imagen a color aclarada - Aclara imagen RGB
  8. Mayor contraste - Aumenta contraste y brillo
  9. Sin ruido (color) - Filtro bilateral en imagen RGB
  10. Combinación - Imagen sin ruido + aclarada

Cómo ejecutarlo

# 1. Asegúrate de estar en el directorio del proyecto
cd openCVClass

# 2. Activa el entorno virtual
source .venv/bin/activate  # macOS/Linux
# .venv\Scripts\activate   # Windows

# 3. Ejecuta el script
python openCV.py

Controles

  • ESC - Cerrar todas las ventanas
  • 'q' - Cerrar todas las ventanas
  • Ctrl+C - Interrumpir ejecución en terminal
  • ❌ (botón X) - Cerrar ventana individual

Funciones Principales

aclarar_imagen(imagen, factor=50)

Aclara una imagen sumando un valor constante a cada píxel.

Parámetros:

  • imagen: Imagen de entrada (color o grises)
  • factor: Valor a sumar (default: 50)

Ejemplo:

img_clara = aclarar_imagen(img_gris, factor=70)

reducir_ruido(imagen, metodo='gaussian', kernel_size=5)

Aplica diferentes filtros para reducir ruido.

Parámetros:

  • imagen: Imagen de entrada
  • metodo: 'gaussian', 'median', o 'bilateral'
  • kernel_size: Tamaño del kernel (debe ser impar)

Ejemplo:

img_limpia = reducir_ruido(img, metodo='bilateral', kernel_size=9)

ajustar_brillo_contraste(imagen, alpha=1.0, beta=0)

Ajusta brillo y contraste de la imagen.

Parámetros:

  • imagen: Imagen de entrada
  • alpha: Factor de contraste (>1 aumenta, <1 disminuye)
  • beta: Factor de brillo (positivo aclara, negativo oscurece)

Ejemplo:

img_ajustada = ajustar_brillo_contraste(img, alpha=1.5, beta=30)

Salida del Script

En la terminal verás:

  • Matriz de píxeles de la imagen (muestra 10x10)
  • Estadísticas: valor mínimo, máximo, promedio y desviación estándar
  • Para imágenes a color: estadísticas por cada canal (B, G, R)

🟢 Práctica 2: Reconocimiento de Placas

Archivo: practica_reconocimiento_placas.py

Sistema interactivo completo para aprender detección de placas vehiculares mediante un menú de 8 preguntas guiadas.

¿Qué hace este script?

Implementa un sistema educativo interactivo que enseña el pipeline completo de reconocimiento de placas:

  • 8 preguntas interactivas con explicaciones detalladas
  • Visualización paso a paso de cada transformación
  • Comparación de técnicas (con/sin filtros, diferentes kernels)
  • Generación de reportes PDF con todas las respuestas e imágenes

Metodología de Detección (Pipeline)

Paso 1: Leer imagen a color → Convertir a escala de grises
          ↓
Paso 2: Filtro Gaussiano (11x11) → Reducir ruido
          ↓
Paso 3: CLAHE → Mejorar contraste adaptativo
          ↓
Paso 4: Binarización (Otsu) → Separar fondo/objeto
          ↓
Paso 5: Canny → Detección de bordes
          ↓
Paso 6: findContours → Encontrar y filtrar contornos (perímetro 200-700)
          ↓
Paso 7: Dibujar rectángulos → Marcar placas candidatas

Cómo ejecutarlo

# 1. Asegúrate de estar en el directorio del proyecto
cd openCVClass

# 2. Activa el entorno virtual
source .venv/bin/activate  # macOS/Linux
# .venv\Scripts\activate   # Windows

# 3. Ejecuta el script
python practica_reconocimiento_placas.py

Menú Interactivo

Al ejecutar verás:

================================================================================
 PRÁCTICA: RECONOCIMIENTO DE PLACAS CON OPENCV
================================================================================

Opciones:
  1. Pregunta 1: Dimensiones y canales de imagen
  2. Pregunta 2: Tipo de filtro espacial
  3. Pregunta 3: Aplicación de filtros
  4. Pregunta 4: Ecualización de histograma
  5. Pregunta 5: Pipeline completo (pasos 2-5)
  6. Pregunta 6: Sin filtro Gaussiano
  7. Pregunta 7: Con todos los pasos
  8. Pregunta 8: Kernel 3x3 vs 11x11
  9. EJECUTAR TODAS
  R. GENERAR REPORTE PDF
  0. Salir
================================================================================

Selecciona una opción (0-9, R):

Descripción de cada Pregunta

Pregunta 1: Dimensiones y canales

  • Aprende a leer imágenes a color (3 canales) y escala de grises (1 canal)
  • Visualiza las diferencias entre BGR y escala de grises
  • Entiende la estructura de matrices .shape

Pregunta 2: Filtro espacial - Pasa Alto vs Pasa Bajo

  • Identifica el tipo de filtro por su kernel
  • Kernel Laplaciano: [[-1,-1,-1],[-1,8,-1],[-1,-1,-1]]
  • Aprende la diferencia entre filtros pasa-alta (bordes) y pasa-baja (suavizado)
  • ✅ Respuesta: B. Pasa alto

Pregunta 3: Aplicación de filtros

  • Entiende el uso del filtro Gaussiano
  • Visualiza el efecto de suavizado en imágenes ruidosas
  • Aprende cuándo aplicar filtros pasa-baja
  • ✅ Respuesta: A. Es un filtro pasa baja para quitar ruido y suavizar

Pregunta 4: Ecualización de histograma

  • Procesa imágenes a COLOR ecualizando cada canal (B, G, R) por separado
  • Visualiza histogramas antes y después
  • Entiende la mejora de contraste
  • ✅ Respuesta: B. El objetivo es mejorar el contraste

Pregunta 5: Pipeline completo

  • Ejecuta los pasos 2, 3, 4, 5, 6 y 7 completos
  • Visualiza cada transformación intermedia
  • Detecta y dibuja placas candidatas
  • Relaciona imágenes del documento con cada paso
  • ✅ Respuesta: Imagen1→Paso4, Imagen2→Paso5, Imagen3→Paso3, Imagen4→Paso2

Pregunta 6: Comparación SIN vs CON Gaussiano

  • Ejecuta el pipeline sin el paso 2 (filtro Gaussiano)
  • Ejecuta el pipeline con el paso 2
  • Compara visualmente los resultados
  • Analiza el impacto en la cantidad de placas detectadas
  • ✅ Respuesta: B. Detecta más de cinco candidatos a placa

Pregunta 7: Pipeline completo con Gaussiano

  • Ejecuta todos los pasos incluyendo el filtro Gaussiano
  • Optimiza la detección de placas
  • Compara resultados con pregunta 6

Pregunta 8: Kernel 3x3 vs 11x11

  • Compara el efecto de diferentes tamaños de kernel
  • Kernel pequeño (3x3): Menos suavizado, más detalles, más ruido
  • Kernel grande (11x11): Más suavizado, menos ruido, menos detalles
  • Visualiza el impacto en la detección de placas

Opción 9: EJECUTAR TODAS

Ejecuta las 8 preguntas secuencialmente con pausas entre cada una. Ideal para:

  • Revisar todo el contenido de una sola vez
  • Estudiar antes de un examen
  • Demostrar todo el proyecto

Opción R: GENERAR REPORTE PDF 📄

Esta es la funcionalidad más importante del script.

¿Qué hace?

Genera un reporte PDF profesional con:

  • Todas las 8 preguntas en orden
  • Respuestas claramente marcadas (fondo verde, texto en negrita)
  • Explicaciones detalladas de cada paso
  • Imágenes procesadas de cada transformación
  • Timestamp en el nombre del archivo
  • Guardado automático en carpeta reporte/

¿Cómo generar el PDF?

# Desde el menú principal:
Selecciona una opción (0-9, R): R

# El sistema mostrará:
================================================================================
📄 GENERANDO REPORTE PDF
================================================================================

✓ Carpeta de reporte: reporte/

🔄 Procesando todas las preguntas...
   (Esto puede tardar unos momentos...)

   [1/8] Procesando Pregunta 1...
   [2/8] Procesando Pregunta 2...
   [3/8] Procesando Pregunta 3...
   [4/8] Procesando Pregunta 4...
   [5/8] Procesando Pregunta 5...
   [6/8] Procesando Pregunta 6...
   [7/8] Procesando Pregunta 7...
   [8/8] Procesando Pregunta 8...

📝 Generando documento PDF...

✅ Reporte PDF generado exitosamente!
   📄 Archivo: reporte/reporte_practica_20251025_143022.pdf
   📁 Ubicación: /ruta/completa/al/archivo.pdf

🧹 Limpiando archivos temporales...
✓ Archivos temporales eliminados

================================================================================
✅ PROCESO COMPLETADO
================================================================================

Contenido del PDF

El PDF incluye para cada pregunta:

  1. Título de la pregunta (fuente grande, negrita)
  2. ✅ Respuesta correcta (fondo verde claro #e8f5e9, texto verde oscuro #27ae60, negrita)
  3. Explicación técnica (texto justificado, explicaciones detalladas)
  4. Imágenes procesadas (todas las transformaciones aplicadas)
  5. Salto de página (cada pregunta en su propia página)

Ejemplo de salida del PDF:

┌─────────────────────────────────────────────────────────┐
│         REPORTE DE PRÁCTICA                            │
│    Reconocimiento de Placas con OpenCV                 │
│         Fecha: 25/10/2025 14:30:22                     │
└─────────────────────────────────────────────────────────┘

Pregunta 1: Dimensiones y canales de imagen
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

┌─────────────────────────────────────────────┐
│ ✅ Alto=248, Ancho=400, Canales gris=1,    │
│    Canales color=3                          │
└─────────────────────────────────────────────┘

Se lee la imagen en formato COLOR (3 canales BGR)
y en escala de GRISES (1 canal).

[Imagen COLOR]
[Imagen GRISES]

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(Continúa con las demás preguntas...)

Características Técnicas

Función auxiliar reutilizable

detectar_y_dibujar_placas(bordes, imagen_color, min_perimetro=200, max_perimetro=700)

Usada en las preguntas 5, 6, 7 y 8. Implementa:

  • Paso 6: Encontrar contornos con cv2.findContours()
  • Filtro por perímetro (200-700 píxeles)
  • Paso 7: Dibujar rectángulos en placas candidatas
  • Criterios de detección:
    • max(s) > alto/2: Placa en mitad inferior
    • prop < 0: Más ancho que alto (rectangular horizontal)

Procesamiento de imágenes

Filtros espaciales:

  • Gaussiano (cv2.GaussianBlur): Suavizado ponderado
  • Laplaciano: Kernel [[-1,-1,-1],[-1,8,-1],[-1,-1,-1]] para bordes

Mejora de contraste:

  • CLAHE (cv2.createCLAHE): Ecualización adaptativa local
  • Ecualización por canal: Procesa B, G, R independientemente

Detección de bordes:

  • Otsu (cv2.THRESH_OTSU): Binarización automática
  • Canny (cv2.Canny): Detección de bordes multi-etapa

Detección de contornos:

  • cv2.findContours(): Encuentra contornos en imagen binaria
  • Filtrado por perímetro y características geométricas

📚 Guía de Uso Detallada

Flujo de trabajo recomendado

Para principiantes:

  1. Empieza con la Práctica 1 (openCV.py)

    python openCV.py
    • Familiarízate con las transformaciones básicas
    • Observa cómo funcionan los filtros
    • Cierra con ESC cuando termines
  2. Continúa con la Práctica 2 - Preguntas individuales

    python practica_reconocimiento_placas.py
    • Selecciona pregunta 1 (más fácil)
    • Lee las explicaciones en terminal
    • Observa las visualizaciones
    • Presiona ENTER para volver al menú
    • Continúa con pregunta 2, luego 3, etc.
  3. Genera tu reporte PDF

    • Selecciona opción R
    • Abre el PDF generado en reporte/
    • Úsalo como referencia de estudio

Para estudiantes avanzados:

  1. Ejecuta todas las preguntas de una vez (opción 9)
  2. Genera el PDF (opción R)
  3. Modifica los parámetros en el código:
    • Cambia tamaños de kernel
    • Ajusta umbrales de Canny
    • Modifica criterios de detección
  4. Compara resultados con diferentes imágenes

Para instructores:

  1. Usa el PDF como material de clase

    • Genera el reporte antes de la clase
    • Proyecta las imágenes procesadas
    • Explica cada paso del pipeline
  2. Modifica las preguntas

    • Edita las funciones pregunta_X()
    • Agrega nuevas preguntas
    • Personaliza las respuestas

Trucos y consejos

Cambiar imágenes de entrada:

Edita las rutas en el código:

# En practica_reconocimiento_placas.py
IMG_DIR = 'img/CochesVarios'  # Cambia esta ruta

# Para usar una imagen específica en una pregunta:
ruta = f'{IMG_DIR}/mi_imagen.png'

Ajustar parámetros del pipeline:

# Tamaño del kernel Gaussiano
imagen_suavizada = cv2.GaussianBlur(imagen_gris, (11, 11), 0)  # Cambia (11,11)

# Parámetros de CLAHE
clahe = cv2.createCLAHE(clipLimit=1.5, tileGridSize=(8, 8))  # Ajusta valores

# Umbrales de Canny
bordes = cv2.Canny(imagen_binaria, 150, 350)  # Cambia 150 y 350

# Rango de perímetros para contornos
resultado = detectar_y_dibujar_placas(bordes, imagen_color,
                                       min_perimetro=200,   # Ajusta
                                       max_perimetro=700)   # Ajusta

Guardar imágenes procesadas:

# Después de procesar una imagen
cv2.imwrite('mi_resultado.png', imagen_procesada)

🔧 Troubleshooting

Error: "No module named 'cv2'"

Solución:

# Asegúrate de que el entorno virtual esté activado
source .venv/bin/activate  # macOS/Linux
.venv\Scripts\activate     # Windows

# Reinstala OpenCV
pip install opencv-contrib-python

Error: "FileNotFoundError: img/CochesVarios/..."

Solución:

# Verifica que la carpeta de imágenes exista
ls img/CochesVarios/

# Si no existe, descarga las imágenes o ajusta IMG_DIR en el código

Las ventanas de matplotlib no se cierran

Solución:

# Presiona ESC o 'q' en cualquier ventana
# O cierra desde la terminal con Ctrl+C

El PDF no se genera

Solución:

# Verifica que reportlab esté instalado
pip install reportlab

# Verifica que tengas permisos de escritura
ls -la reporte/  # Debe existir y ser escribible

# Si no existe la carpeta, créala
mkdir reporte

Matplotlib no muestra ventanas en macOS

Solución:

# Instala el backend de Qt
pip install PyQt5

# O usa el backend TkAgg
export MPLBACKEND=TkAgg
python practica_reconocimiento_placas.py

Error: "RuntimeError: main thread is not in main loop"

Solución:

# Agrega al inicio del script
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt

Las imágenes se ven muy pequeñas/grandes

Solución:

# Ajusta el tamaño de las figuras en mostrar_imagenes()
fig, axes = plt.subplots(filas, cols, figsize=(5*cols, 4*filas))
#                                              ↑       ↑
#                                         Cambia estos valores

📖 Recursos Adicionales

Documentación oficial:

Tutoriales recomendados:

Conceptos clave para estudiar:

  • Convolución: Operación fundamental en filtros espaciales
  • Histogramas: Distribución de intensidades de píxeles
  • Morfología: Operaciones de erosión y dilatación
  • Espacio de color: BGR vs RGB vs HSV vs LAB
  • Umbrales adaptativos: Otsu, CLAHE

👨‍💻 Autor

Proyecto creado como práctica educativa de procesamiento de imágenes con OpenCV.

Tecnologías utilizadas:

  • Python 3.7+
  • OpenCV 4.8+
  • NumPy
  • Matplotlib
  • ReportLab

📄 Licencia

Este proyecto es de uso educativo y está disponible para aprendizaje y enseñanza.


🎯 Próximos Pasos

Después de completar estas prácticas, puedes:

  1. Mejorar la detección de placas:

    • Implementa reconocimiento de caracteres (OCR)
    • Agrega validación de formato de placas
    • Implementa seguimiento de placas en video
  2. Expandir el proyecto:

    • Detección de múltiples objetos
    • Clasificación de vehículos
    • Reconocimiento facial
    • Detección de movimiento
  3. Optimizar el código:

    • Usa procesamiento paralelo
    • Implementa caché de resultados
    • Optimiza loops con NumPy vectorización
  4. Crear tu propio proyecto:

    • Sistema de vigilancia
    • Contador de personas
    • Detector de defectos en productos
    • Asistente de estacionamiento

📞 Soporte

Si encuentras problemas o tienes preguntas:

  1. Revisa la sección Troubleshooting
  2. Consulta la documentación de OpenCV
  3. Abre un issue en el repositorio de GitHub

¡Feliz aprendizaje! 🚀📸

About

Clase1 master IA

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages