Los Ojos del Robot: Como una Computadora “Ve” los Bordes de tu Dibujo

Pon tu mano sobre una hoja de papel y repasa su contorno con un lapiz. Levanta la mano. Lo que queda es tu silueta: una linea cerrada que describe la forma de tu mano sin necesidad de dibujar cada arruga, cada poro, cada tono de piel.

Eso mismo hace un algoritmo de vectorizacion: repasa los contornos de las formas en una imagen. Pero en lugar de usar un lapiz, usa matematicas. Y en lugar de ver la imagen completa, tiene que analizar pixel por pixel buscando “donde termina un color y empieza otro.”

El Ojo Matematico: Deteccion de Bordes

Imagina que estas caminando de noche con una linterna. Apuntas al suelo y ves un cambio: el pasto verde termina y empieza la banqueta gris. Ese cambio de color es un “borde.” Tu cerebro lo detecta instantaneamente. Una computadora necesita un proceso mas sistematico.

El primer paso es la cuantizacion de color. Las imagenes reales tienen millones de colores. Demasiados para trabajar. La cuantizacion reduce la paleta a un numero manejable:

num_colores = 2^colorPrecision

Si colorPrecision = 3, entonces 2^3 = 8 colores. Si colorPrecision = 6, entonces 2^6 = 64 colores. Si colorPrecision = 8, entonces 2^8 = 256 colores.

Es como si tomaras todas tus pinturas de acuarela y dijeras: “solo voy a usar estas 64 hoy.” Los colores intermedios se redondean al mas cercano de esos 64. Pierdes algo de detalle, pero ganas en velocidad y en bordes mas limpios.

Esquinas vs Curvas Suaves: El Corner Threshold

Una vez que tienes los contornos, viene la decision crucial: ¿esto es una esquina afilada o una curva suave?

Imagina que estas dibujando un cuadrado con un lapiz. Cuando llegas a la esquina, giras el lapiz 90 grados de golpe. Eso es una esquina. En cambio, si dibujas un circulo, el lapiz gira poquito a poquito, nunca da un giro brusco.

El parametro cornerThreshold (umbral de esquina) controla esto. Es el angulo minimo que debe tener un giro para considerarse “esquina.” Si pones un valor pequeño (como 10 grados), casi cualquier curvatura se vuelve esquina y obtienes una imagen muy fiel pero con MUCHOS puntos. Si pones un valor grande (como 90 grados), solo los giros muy bruscos se consideran esquinas y la imagen se simplifica.

Piensa en un mapa: si haces zoom mucho, necesitas muchas lineas para describir cada recoveco de la costa. Si haces zoom poco, la costa se ve como una linea bastante recta. El corner threshold es ese “nivel de zoom.”

Curvas de Bezier: La Matematica que Dibuja lo que tu Ojo Quiere Ver

Los contornos detectados no se guardan como miles de puntitos. Seria muy pesado. En su lugar, se ajustan con curvas de Bezier cubicas.

Una curva de Bezier cubica se define con 4 puntos: inicio, fin, y dos puntos de control. Los puntos de control son como imanes invisibles que jalan la curva hacia ellos sin tocarla.

Imagina que amarras una liga entre dos clavos (inicio y fin). Luego pones dos imanes (puntos de control) cerca de la liga. La liga se curva hacia los imanes pero sin tocarlos. Asi funcionan las Bezier.

El modo “Spline” de VTracer ajusta automaticamente curvas de Bezier a los contornos detectados. Decide cuantos puntos de control necesita y donde ponerlos para que la curva siga el borde lo mejor posible con la menor cantidad de datos.

Eliminando el Ruido: filterSpeckle

Las imagenes reales tienen imperfecciones. Un puntito de polvo. Un pixel fuera de lugar. Si el algoritmo tratara de vectorizar cada minimo puntito, el SVG resultante seria gigantesco y lleno de basura.

El filterSpeckle es el filtro anti-mugre. Dice: “si una region tiene menos de N pixeles, ignorala.” Si filterSpeckle = 10, cualquier forma mas pequeña que 10 pixeles simplemente no se dibuja.

Es como cuando barres tu cuarto y las particulas de polvo mas pequeñas simplemente las ignoras. No vale la pena agacharse a recoger cada una.

Preprocesamiento: Blanco y Negro para Dibujos

A veces lo que quieres vectorizar no es una foto a color sino un dibujo de lineas. Un boceto en blanco y negro. Para esos casos, tenemos un preprocesamiento especial.

Primero convertimos a escala de grises usando la formula de luminancia perceptual que ya conocemos:

gris = 0.299  R + 0.587  G + 0.114 * B

Luego aplicamos un umbral (threshold):

si gris < umbral: negro
si gris >= umbral: blanco

Esto convierte la imagen en puros pixeles blancos y negros, sin grises intermedios. Los bordes se vuelven nitidisimos y la vectorizacion produce resultados mucho mas limpios.

Tambien podemos posterizar (reducir los niveles de color):

C_post = floor(C  niveles / 256)  (256 / (niveles - 1))

Es como si tuvieras una escalera de color con pocos escalones. En lugar de 256 tonos de rojo, tienes 4 o 5. Cada pixel se asigna al escalon mas cercano. Esto agrupa colores similares y crea zonas de color plano ideales para vectorizar.

Vamos a Descubrir Juntos

“Ver” es mucho mas que capturar luz. Es interpretar. Cuando tu miras una foto, instantaneamente separas los objetos del fondo, detectas bordes, ignoras el ruido. Todo sin esfuerzo consciente.

Los algoritmos de vectorizacion intentan imitar ese proceso con matematicas. Son torpes comparados con tu cerebro, pero tienen una ventaja: no se cansan, no se distraen, y pueden procesar 2 millones de pixeles en medio segundo.

La proxima vez que traces la silueta de tu mano con un lapiz, recuerda: estas haciendo a mano lo que VTracer hace con curvas de Bezier a velocidad de maquina. Eres un algoritmo de vectorizacion natural.