Comparación de métodos de interpolación de imágenes - Vecino más cercano, bilineal, bicúbica y Lanczos
Qué es la interpolación de imágenes - Por qué es necesaria
La interpolación de imágenes estima valores de píxeles desconocidos a partir de valores de píxeles conocidos en coordenadas no enteras. Se utiliza en toda transformación geométrica que requiere reorganización de la cuadrícula de píxeles: redimensionamiento (ampliación/reducción), rotación, corrección de distorsión y transformación de perspectiva.
Cuándo se necesita la interpolación: Por ejemplo, al ampliar una imagen de 100×100 a 200×200, el mapeo inverso de cada posición de píxel de salida a la imagen de entrada produce coordenadas no enteras (ej: x=3.7, y=5.2). La interpolación estima el valor del píxel en estas coordenadas fraccionarias a partir de los píxeles conocidos circundantes.
Métricas de evaluación de calidad:
- PSNR (Peak Signal-to-Noise Ratio): Diferencia numérica respecto al original. Mayor es mejor.
- SSIM (Structural Similarity): Similitud estructural alineada con la percepción. 1.0 es coincidencia perfecta.
- Preservación de bordes: Si se mantiene la nitidez de los bordes.
- Artefactos: Degradación visual como escalonado, ringing o desenfoque.
Clasificación de métodos de interpolación: Los métodos se clasifican por el número de píxeles de referencia (tamaño de soporte). Vecino más cercano usa 1 píxel, bilineal usa 4 píxeles (2×2), bicúbica usa 16 píxeles (4×4) y Lanczos-3 usa 36 píxeles (6×6). Más píxeles de referencia mejoran la calidad pero aumentan proporcionalmente el costo computacional.
Vecino más cercano (Nearest Neighbor) - El más rápido pero menor calidad
El vecino más cercano es el algoritmo de interpolación más simple, utilizando el valor del píxel en la coordenada entera más cercana a la posición objetivo. Tiene un costo computacional mínimo y sigue siendo la opción óptima para casos de uso específicos.
Algoritmo: Para el píxel de salida (x', y'), se calcula la coordenada de entrada correspondiente (x, y) y se usa el valor del píxel en round(x), round(y). Solo se necesita redondeo de punto flotante, requiriendo un único acceso a memoria por píxel.
Ventajas:
- Cálculo más rápido (aproximadamente 3-4 veces más rápido que bilineal)
- Nunca genera nuevos valores de color (solo produce valores presentes en la entrada)
- Óptimo para ampliación de pixel art e imágenes de color indexado
- Esencial para transformación de máscaras de segmentación y mapas de etiquetas
Desventajas:
- Escalonado tipo bloque (bordes en escalera) prominente al ampliar
- El aliasing (moiré) ocurre fácilmente al reducir
- Los bordes diagonales y curvas aparecen escalonados
- Inapropiado para fotografías o gradientes
Casos de uso apropiados: Para ampliación en múltiplos enteros (2x, 3x, 4x) de pixel art, el vecino más cercano es la única opción correcta que preserva la nitidez de los píxeles. Para máscaras de segmentación semántica, previene la generación de valores de clase inexistentes. Se especifica como cv2.INTER_NEAREST en OpenCV.
Rendimiento medido: La ampliación de 1920×1080 → 3840×2160 tarda aproximadamente 2ms (CPU). En las mismas condiciones, bilineal tarda aproximadamente 7ms y bicúbica aproximadamente 15ms.
Interpolación bilineal - Equilibrio entre calidad y velocidad
La interpolación bilineal estima valores usando un promedio ponderado de 4 píxeles circundantes (2×2). Ofrece un excelente equilibrio entre calidad y costo computacional, siendo el método de interpolación más utilizado en aplicaciones en tiempo real.
Algoritmo: Para encontrar el valor en la coordenada (x, y), se realizan dos interpolaciones lineales en la dirección x, luego una en la dirección y (3 interpolaciones lineales en total). Específicamente, a partir de 4 píxeles adyacentes f(0,0), f(1,0), f(0,1), f(1,1) y las partes fraccionarias (dx, dy):
result = f(0,0)(1-dx)(1-dy) + f(1,0)dx(1-dy) + f(0,1)(1-dx)dy + f(1,1)dx*dy
Ventajas:
- Resultados dramáticamente más suaves comparados con vecino más cercano
- Bajo costo computacional adecuado para procesamiento en tiempo real
- Soporte nativo de hardware GPU (muestreo de texturas)
- Proporciona calidad suficiente para la mayoría de aplicaciones
Desventajas:
- Los bordes se vuelven ligeramente borrosos (efecto de filtro paso bajo)
- El desenfoque se hace notable con ampliaciones significativas (4x o más)
- Menos nítido comparado con bicúbica o Lanczos
Aceleración GPU: Las GPU modernas implementan la interpolación bilineal en hardware en las unidades de textura sin costo adicional. gl.LINEAR de WebGL, la memoria de textura de CUDA y otras interfaces de programación GPU usan bilineal como método de interpolación predeterminado.
Se especifica como cv2.INTER_LINEAR en OpenCV y es el valor predeterminado para cv2.resize(). En Pillow, se usa Image.BILINEAR (o Image.LINEAR).
Interpolación bicúbica - El estándar para redimensionamiento de alta calidad
La interpolación bicúbica referencia 16 píxeles (4×4) alrededor de la coordenada objetivo, ponderándolos con un polinomio cúbico. Es el método de interpolación predeterminado de Photoshop y ampliamente adoptado como estándar para procesamiento de imágenes con calidad de impresión.
Algoritmo: Referencia 4 puntos en cada dirección, ponderados por un kernel de convolución cúbica. La función del kernel W(t) es:
W(t) = (a+2)|t|³ - (a+3)|t|² + 1 (|t| ≤ 1)
W(t) = a|t|³ - 5a|t|² + 8a|t| - 4a (1 < |t| < 2)
El parámetro a es típicamente -0.5 (spline Catmull-Rom) o -0.75 (Photoshop). a=-0.5 proporciona precisión de aproximación teóricamente óptima, mientras que a=-0.75 produce resultados más nítidos.
Ventajas:
- Preservación de bordes notablemente más nítida que bilineal
- Alta fidelidad en la reproducción de gradientes suaves
- Menos desenfoque durante la ampliación, manteniendo apariencia natural
- Precisión suficiente para procesamiento de imágenes con calidad de impresión
Desventajas:
- Aproximadamente 2-3 veces el costo computacional de bilineal
- Puede ocurrir ligero ringing (sobreimpulso cerca de bordes)
- Calidad marginalmente inferior comparada con Lanczos
Comparación medida (1920×1080 → 3840×2160): PSNR promedia 1.5-2.0dB más alto que bilineal, SSIM es 0.02-0.03 puntos mejor. El tiempo de procesamiento es aproximadamente 15ms (CPU), cerca de 2 veces bilineal. Se especifica como cv2.INTER_CUBIC en OpenCV e Image.BICUBIC en Pillow.
Interpolación Lanczos - Remuestreo de máxima calidad
La interpolación Lanczos utiliza un kernel teóricamente casi óptimo derivado de la función sinc con ventana Lanczos, logrando el remuestreo de mayor calidad. Las variantes incluyen Lanczos-2 (4×4), Lanczos-3 (6×6) y Lanczos-4 (8×8), siendo Lanczos-3 la más común.
Fundamento teórico: La interpolación ideal usa convolución con función sinc (sin(πx)/(πx)), pero sinc tiene soporte infinito haciéndola impráctica. El kernel Lanczos trunca sinc con una ventana Lanczos (sinc(x/a)), proporcionando la aproximación de soporte finito más cercana a sinc.
L(x) = sinc(x) × sinc(x/a) (|x| < a)
L(x) = 0 (|x| ≥ a)
a=3 (Lanczos-3) se considera el equilibrio óptimo calidad-costo, referenciando 6×6=36 píxeles.
Ventajas:
- Preservación de bordes más nítida entre todos los métodos de interpolación
- Excelente supresión de aliasing
- Calidad particularmente alta durante la reducción (efecto de prefiltrado)
- Óptimo para redimensionamiento de fotos de alta calidad
Desventajas:
- Mayor costo computacional (aproximadamente 2-3 veces bicúbica)
- Los artefactos de ringing pueden ser más pronunciados que con bicúbica
- Pueden ser visibles halos cerca de bordes de alto contraste
Rendimiento medido: 1920×1080 → 3840×2160 tarda aproximadamente 35ms (CPU). PSNR es 0.3-0.8dB más alto que bicúbica, con diferencias más pronunciadas en la reducción. Se especifica como cv2.INTER_LANCZOS4 en OpenCV e Image.LANCZOS en Pillow. libvips usa Lanczos-3 por defecto y está optimizado para procesamiento por lotes.
Guía de selección óptima de interpolación por caso de uso
La selección del método de interpolación depende del caso de uso, requisitos de calidad y restricciones de rendimiento. A continuación se presentan recomendaciones específicas para cada escenario.
Generación de miniaturas para web: Se recomienda Lanczos-3. Para la reducción, el efecto de prefiltrado de Lanczos es el más efectivo para suprimir moiré y aliasing. El tiempo de procesamiento no es una preocupación para la generación previa del lado del servidor. Tanto ImageMagick como libvips usan Lanczos por defecto.
Procesamiento de video en tiempo real: Se recomienda bilineal. El soporte de hardware GPU lo hace disponible sin costo adicional. Para procesamiento en tiempo real 4K 60fps, bicúbica y superiores se vuelven demasiado costosas incluso en GPU.
Pixel art y gráficos retro: El vecino más cercano es la única respuesta correcta. Otros métodos difuminan los bordes de los píxeles, destruyendo la nitidez intencionada del pixel art. Limitar a múltiplos enteros (2x, 3x) y evitar escalado no entero.
Imágenes médicas y científicas: Se recomienda bicúbica (a=-0.5). El ringing de Lanczos podría potencialmente afectar el diagnóstico, haciendo que la bicúbica con menor ringing sea más segura. La mayoría de visores DICOM adoptan interpolación bicúbica.
Salida de alta resolución para impresión: Se recomienda Lanczos-3. Para impresión, la calidad tiene prioridad absoluta sobre el tiempo de procesamiento. A 300dpi y superior, las diferencias de calidad de interpolación se hacen visibles, justificando la selección de Lanczos de máxima calidad.
Preprocesamiento para aprendizaje automático: Bilineal o bicúbica. La velocidad de procesamiento importa para el preprocesamiento de datos de entrenamiento donde se procesan millones de imágenes, y las diferencias de velocidad pueden sumar horas. Bilineal es suficiente para inferencia. F.interpolate de PyTorch usa bilineal por defecto.