Python vs Verilog: Procesamiento de Imágenes en Tiempo Real

5/2/20263 min read

⚙️ Dos enfoques, un mismo problema

El procesamiento de imágenes es una tarea clave en múltiples aplicaciones industriales y tecnológicas: visión artificial, inspección automatizada, sistemas embebidos, robótica, entre otros.

Sin embargo, aunque el problema a resolver sea el mismo —procesar una imagen—, el enfoque utilizado puede cambiar radicalmente el rendimiento del sistema.

En este contexto, Python y Verilog representan dos paradigmas completamente distintos:

  • Python → procesamiento en software ejecutado en CPU

  • Verilog → procesamiento en hardware implementado en FPGA o ASIC

Comprender esta diferencia no es solo un tema académico, sino una decisión crítica en el diseño de sistemas de alto desempeño.

⚙️ Python: un vistazo desde el procesamiento en software

Python es uno de los lenguajes más populares en la actualidad debido a su facilidad de uso, versatilidad y amplio ecosistema de librerías.

En el campo del procesamiento de imágenes, permite:

  • Aplicar filtros y transformaciones complejas

  • Trabajar con librerías especializadas como OpenCV

  • Desarrollar soluciones rápidamente

No obstante, para entender claramente sus limitaciones frente a hardware, en este artículo se utiliza un enfoque deliberadamente básico: procesamiento mediante bucles (for).

Ejecución secuencial y cuello de botella

Cuando procesamos una imagen en Python:

  1. Se lee la imagen

  2. Se recorre pixel por pixel

  3. Se aplica una operación (como un filtro)

  4. Se escribe el resultado

Cada uno de estos pasos se ejecuta como instrucciones en la CPU, de manera secuencial.

Esto implica que:

  • Cada operación depende de la anterior

  • No existe paralelismo real (en este caso)

  • El rendimiento queda limitado por la frecuencia del procesador

Aunque existen técnicas avanzadas como multiprocesamiento o vectorización, en este análisis se omiten intencionalmente para evidenciar la diferencia fundamental con hardware.

⚙️ Verilog: implementación de hardware para procesamiento de imágenes

A diferencia de Python, Verilog no describe instrucciones que se ejecutan, sino circuitos que existen físicamente.

Esto cambia completamente la forma de abordar el problema.

En lugar de ejecutar operaciones paso a paso, el hardware permite:

  • Procesamiento paralelo

  • Ejecución simultánea de múltiples operaciones

  • Alta velocidad determinística

Una de las preguntas más comunes cuando se inicia en diseño digital es:

¿Cómo representamos una imagen dentro de hardware?

Durante la etapa de simulación, Verilog permite cargar archivos de datos mediante instrucciones como:

  • $readmemb

  • $readmemh

Estos archivos pueden tener formatos como:

  • .mem

  • .hex

  • .txt

En esencia, contienen datos binarios que representan la imagen.

¿Cómo se carga una imagen en un sistema digital?

Representación de un pixel en memoria

Considerando un pixel en formato RGB de 24 bits:

  • 8 bits → Rojo

  • 8 bits → Verde

  • 8 bits → Azul

Ejemplos:

  • Rojo → 11111111 00000000 00000000

  • Amarillo → 11111111 11111111 00000000

Cada línea del archivo de memoria representa un pixel.

Por ejemplo:

  • Imagen Full HD (1920x1080)
    2,073,600 líneas de datos

Es importante distinguir dos etapas fundamentales:

Simulación

  • Los datos se cargan como variables

  • Se leen secuencialmente en el testbench

Síntesis

  • Los datos se mapean a memoria física (ROM)

  • Se accede mediante direcciones

Arquitectura típica:

  • memory_address → dirección de memoria

  • RGB_in → salida de datos

Diferencia entre simulación y síntesis

⚙️ El filtro de Sobel

El filtro de Sobel es un operador utilizado para detectar bordes en imágenes.

Se basa en una operación conocida como convolución.

Consiste en:

  • Tomar una ventana (kernel)

  • Multiplicarla por una región de la imagen

  • Obtener un valor de salida

En este caso se utiliza un kernel de 3x3.

¿Qué es la convolución?

Componentes del filtro

  • Gx → detecta cambios en columnas (bordes verticales)

  • Gy → detecta cambios en filas (bordes horizontales)

La combinación de ambos permite obtener una imagen donde los bordes son claramente visibles.

⚙️ Implementación del filtro en Python

La implementación se realiza usando estructuras básicas:

  • Bucles for

  • Acceso directo a píxeles

Este enfoque refleja cómo la CPU ejecuta instrucciones simples.

Resultado de rendimiento

Para una imagen de 1920x1080:

⏱ Tiempo de ejecución: 9.37 segundos

Esto evidencia el costo de la ejecución secuencial.

⚙️ Implementación en Verilog (simulación)

En este caso no se implementa directamente el hardware físico, sino su simulación en ModelSim.

Aun así, el comportamiento refleja cómo se ejecutaría en hardware.

Resultado

⏱ Tiempo: ~10 ms (9946120 ns)

⚙️ Comparativa final

👉 Diferencia: ~1000x

⚙️ Reflexión final

Este resultado no significa que Python sea “peor”.

Significa que:

  • Cada herramienta tiene su contexto

  • El hardware es clave cuando se requiere tiempo real

🚀 Lleva el procesamiento de imágenes al siguiente nivel

Si quieres entender cómo pasar de software a hardware y diseñar sistemas de alto rendimiento, estos temas son el siguiente paso:

👉 Continúa aprendiendo:

  • Process en VHDL

  • ModelSim: simulación de hardware

  • Instalación de Quartus Prime Lite

Estos conceptos son clave para implementar procesamiento en tiempo real sobre FPGA.

Accede a nuestro curso de FPGA y empieza desde cero
🌐 (link a /curso-fpga)

Descubre nuestras soluciones de automatización industrial
🌐 (link a /automatizacion-industrial)