Proyecto completo de prácticas para aprender procesamiento de imágenes usando OpenCV en Python, incluyendo fundamentos básicos y reconocimiento de placas vehiculares.
- Descripción General
- Requisitos del Sistema
- Instalación
- Estructura del Proyecto
- Práctica 1: Fundamentos de OpenCV
- Práctica 2: Reconocimiento de Placas
- Guía de Uso Detallada
- Troubleshooting
- Autor
Este repositorio contiene dos prácticas completas de procesamiento de imágenes con OpenCV:
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
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
- Python: 3.7 o superior
- Sistema Operativo: Windows, macOS o Linux
- Espacio en disco: ~100 MB (incluyendo dependencias)
Sigue estos pasos para configurar el entorno de trabajo:
git clone git@github.com:ddeepdev/masterIA-openCV1.git
cd openCVClassEn macOS/Linux:
python3 -m venv .venv
source .venv/bin/activateEn Windows:
python -m venv .venv
.venv\Scripts\activateDeberías ver (.venv) al inicio de tu línea de comandos, indicando que el entorno está activo.
pip install -r requirements.txtEsto instalará:
opencv-contrib-python>=4.8.0- Biblioteca principal de procesamiento de imágenesnumpy>=1.24.0- Operaciones matriciales y numéricasmatplotlib>=3.7.0- Visualización de gráficos e imágenespython-docx>=1.1.0- Lectura de documentos Wordreportlab>=4.0.0- Generación de reportes PDF
python -c "import cv2; print(f'OpenCV version: {cv2.__version__}')"Deberías ver algo como: OpenCV version: 4.8.0 o superior.
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
Script básico para aprender los fundamentos de procesamiento de imágenes.
Procesa una imagen aplicando diferentes transformaciones y muestra 10 ventanas con los resultados:
- Imagen original a color - Imagen sin modificar en BGR
- Imagen en escala de grises - Conversión a 1 canal
- Imagen en grises aclarada - Suma de valor constante
- Filtro Gaussiano - Suavizado para reducir ruido
- Filtro de Mediana - Elimina ruido "salt and pepper"
- Filtro Bilateral - Reduce ruido preservando bordes
- Imagen a color aclarada - Aclara imagen RGB
- Mayor contraste - Aumenta contraste y brillo
- Sin ruido (color) - Filtro bilateral en imagen RGB
- Combinación - Imagen sin ruido + aclarada
# 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- ESC - Cerrar todas las ventanas
- 'q' - Cerrar todas las ventanas
- Ctrl+C - Interrumpir ejecución en terminal
- ❌ (botón X) - Cerrar ventana individual
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)Aplica diferentes filtros para reducir ruido.
Parámetros:
imagen: Imagen de entradametodo:'gaussian','median', o'bilateral'kernel_size: Tamaño del kernel (debe ser impar)
Ejemplo:
img_limpia = reducir_ruido(img, metodo='bilateral', kernel_size=9)Ajusta brillo y contraste de la imagen.
Parámetros:
imagen: Imagen de entradaalpha: 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)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)
Sistema interactivo completo para aprender detección de placas vehiculares mediante un menú de 8 preguntas guiadas.
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
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
# 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.pyAl 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):
- 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
- 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
- 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
- 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
- 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
- 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
- Ejecuta todos los pasos incluyendo el filtro Gaussiano
- Optimiza la detección de placas
- Compara resultados con pregunta 6
- 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
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
Esta es la funcionalidad más importante del script.
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/
# 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
================================================================================El PDF incluye para cada pregunta:
- Título de la pregunta (fuente grande, negrita)
- ✅ Respuesta correcta (fondo verde claro
#e8f5e9, texto verde oscuro#27ae60, negrita) - Explicación técnica (texto justificado, explicaciones detalladas)
- Imágenes procesadas (todas las transformaciones aplicadas)
- Salto de página (cada pregunta en su propia página)
┌─────────────────────────────────────────────────────────┐
│ 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...)
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 inferiorprop < 0: Más ancho que alto (rectangular horizontal)
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
-
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
-
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.
-
Genera tu reporte PDF
- Selecciona opción R
- Abre el PDF generado en
reporte/ - Úsalo como referencia de estudio
- Ejecuta todas las preguntas de una vez (opción 9)
- Genera el PDF (opción R)
- Modifica los parámetros en el código:
- Cambia tamaños de kernel
- Ajusta umbrales de Canny
- Modifica criterios de detección
- Compara resultados con diferentes imágenes
-
Usa el PDF como material de clase
- Genera el reporte antes de la clase
- Proyecta las imágenes procesadas
- Explica cada paso del pipeline
-
Modifica las preguntas
- Edita las funciones
pregunta_X() - Agrega nuevas preguntas
- Personaliza las respuestas
- Edita las funciones
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'# 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# Después de procesar una imagen
cv2.imwrite('mi_resultado.png', imagen_procesada)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-pythonSolució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ódigoSolución:
# Presiona ESC o 'q' en cualquier ventana
# O cierra desde la terminal con Ctrl+CSolució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 reporteSolución:
# Instala el backend de Qt
pip install PyQt5
# O usa el backend TkAgg
export MPLBACKEND=TkAgg
python practica_reconocimiento_placas.pySolución:
# Agrega al inicio del script
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as pltSolució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- 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
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
Este proyecto es de uso educativo y está disponible para aprendizaje y enseñanza.
Después de completar estas prácticas, puedes:
-
Mejorar la detección de placas:
- Implementa reconocimiento de caracteres (OCR)
- Agrega validación de formato de placas
- Implementa seguimiento de placas en video
-
Expandir el proyecto:
- Detección de múltiples objetos
- Clasificación de vehículos
- Reconocimiento facial
- Detección de movimiento
-
Optimizar el código:
- Usa procesamiento paralelo
- Implementa caché de resultados
- Optimiza loops con NumPy vectorización
-
Crear tu propio proyecto:
- Sistema de vigilancia
- Contador de personas
- Detector de defectos en productos
- Asistente de estacionamiento
Si encuentras problemas o tienes preguntas:
- Revisa la sección Troubleshooting
- Consulta la documentación de OpenCV
- Abre un issue en el repositorio de GitHub
¡Feliz aprendizaje! 🚀📸