- Imagen ampliada 3× con la interpolación del vecino más cercano
- Imagen ampliada 3x con el algoritmo hq3x
Los algoritmos de escalado de pixel art son filtros gráficos que intentan mejorar la apariencia de los gráficos de pixel art 2D dibujados a mano . Estos algoritmos son una forma de mejora automática de imágenes. Los algoritmos de escalado de pixel art emplean métodos significativamente diferentes a los métodos comunes de cambio de escala de imágenes , que tienen como objetivo preservar la apariencia de las imágenes.
Como los gráficos de pixel art se utilizan comúnmente en resoluciones muy bajas , emplean un coloreado cuidadoso de píxeles individuales. Esto da como resultado gráficos que dependen de una gran cantidad de señales visuales estilizadas para definir formas complejas. Se han desarrollado varios algoritmos especializados [1] para manejar el cambio de escala de dichos gráficos.
Estos algoritmos especializados pueden mejorar la apariencia de los gráficos pixel art, pero al hacerlo introducen cambios que pueden ser indeseables, especialmente si el objetivo es reproducir fielmente la apariencia original.
Dado que una aplicación típica de esta tecnología es mejorar la apariencia de los videojuegos de cuarta generación y anteriores en emuladores de arcade y consola , muchos algoritmos de escalado de pixel art están diseñados para ejecutarse en tiempo real para imágenes de entrada suficientemente pequeñas a 60 cuadros por segundo . Esto impone restricciones al tipo de técnicas de programación que se pueden utilizar para este tipo de procesamiento en tiempo real. [ cita requerida ] Muchos funcionan solo en factores de escala específicos. 2× es el factor de escala más común, mientras que 3×, 4×, 5× y 6× existen pero son menos utilizados.
El chip generador de caracteres de teletexto Mullard SAA5050 (1980) utilizaba un algoritmo primitivo de escalado de píxeles para generar caracteres de mayor resolución en la pantalla a partir de una representación de menor resolución de su ROM interna . Internamente, cada forma de carácter se definía en una cuadrícula de 5 × 9 píxeles, que luego se interpolaba suavizando las diagonales para dar un carácter de 10 × 18 píxeles, con una forma característicamente angular, rodeado en la parte superior e izquierda por dos píxeles de espacio en blanco. El algoritmo solo funciona con datos de origen monocromos y supone que los píxeles de origen serán lógicamente verdaderos o falsos según estén "activados" o "desactivados". Se supone que los píxeles "fuera del patrón de la cuadrícula" están desactivados. [2] [3] [4]
El algoritmo funciona de la siguiente manera:
Abecedario --\ 1 2DEF --/ 3 41 = B | (A y E y !B y !D)2 = B | (C y E y !B y !F)3 = E | (!A y !E y B y D)4 = E | (!C y !E y B y F)
Tenga en cuenta que este algoritmo, al igual que el algoritmo Eagle que se muestra a continuación, tiene un defecto: si aparece un patrón de 4 píxeles en forma de diamante hueco, el hueco se borrará con la expansión. La ROM de caracteres interna del SAA5050 evita cuidadosamente el uso de este patrón.
El caso degenerado:
* * * *
se convierte en:
** **** ****** ****** **** **
Eric's Pixel Expansion (EPX) es un algoritmo desarrollado por Eric Johnston en LucasArts alrededor de 1992, cuando portó los juegos del motor SCUMM de IBM PC (que funcionaba a 320 × 200 × 256 colores) a las primeras computadoras Macintosh a color, que funcionaban a más o menos el doble de esa resolución. [5] El algoritmo funciona de la siguiente manera, expandiendo P en 4 nuevos píxeles en función del entorno de P:
1=P; 2=P; 3=P; 4=P; SI C==A => 1=A SI A==B => 2=B SI D==C => 3=C SI B==D => 4=D SI de A, B, C, D, tres o más son idénticos: 1=2=3=4=P
Las implementaciones posteriores de este mismo algoritmo (como AdvMAME2× y Scale2×, desarrolladas alrededor de 2001) son ligeramente más eficientes pero funcionalmente idénticas:
1=P; 2=P; 3=P; 4=P; SI C==A Y C!=D Y A!=B => 1=A SI A==B Y A!=C Y B!=D => 2=B SI D==C Y D!=B Y C!=A => 3=C SI B==D Y B!=A Y D!=C => 4=D
AdvMAME2× está disponible en DOSBox a través de la opción scaler=advmame2x
dosbox.conf .
El algoritmo AdvMAME4×/Scale4× es simplemente EPX aplicado dos veces para obtener una resolución de 4×.
El algoritmo AdvMAME3×/Scale3× (disponible en DOSBox mediante la opción scaler=advmame3x
dosbox.conf ) puede considerarse como una generalización de EPX al caso 3×. Los píxeles de las esquinas se calculan de forma idéntica a EPX.
1=E; 2=E; 3=E; 4=E; 5=E; 6=E; 7=E; 8=E; 9=E; SI D==B Y D!=H Y B!=F => 1=D SI (D==B Y D!=H Y B!=F Y E!=C) O (B==F Y B!=D Y F!=H Y E!=A) => 2=B SI B==F Y B!=D Y F!=H => 3=F SI (H==D Y H!=F Y D!=B Y E!=A) O (D==B Y D!=H Y B!=F Y E!=G) => 4=D 5=E SI (B==F Y B!=D Y F!=H Y E!=I) O (F==H Y F!=B Y H!=D Y E!=C) => 6=F SI H==D Y H!=F Y D!=B => 7=D SI (F==H Y F!=B Y H!=D Y E!=G) O (H==D Y H!=F Y D!=B Y E!=I) => 8=H SI F==H Y F!=B Y H!=D => 9=F
También existe una variante mejorada de Scale3× llamada ScaleFX, desarrollada por Sp00kyFox, y una versión combinada con Reverse-AA llamada ScaleFX-Hybrid. [6] [7] [8]
Eagle funciona de la siguiente manera: por cada píxel de entrada, generaremos 4 píxeles de salida. Primero, establecemos los 4 con el color del píxel que estamos escalando actualmente (como vecino más cercano). A continuación, observamos los tres píxeles de arriba, a la izquierda y en diagonal arriba a la izquierda: si los tres son del mismo color, establecemos el píxel superior izquierdo de nuestro cuadrado de salida con ese color en lugar del color del vecino más cercano. Trabajamos de manera similar para los cuatro píxeles y luego pasamos al siguiente. [9]
Suponga una matriz de entrada de 3 × 3 píxeles donde el píxel más central es el píxel que se va a escalar y una matriz de salida de 2 × 2 píxeles (es decir, el píxel escalado).
primero:|Entonces. . . --\ CC | STU --\ 1 2. C . --/ CC |VCW --/ 3 4. . . |XYZ | SI V==S==T => 1=S | SI T==U==W => 2=U | SI V==X==Y => 3=X | SI W==Z==Y => 4=Z
Por lo tanto, si tenemos un solo píxel negro sobre un fondo blanco, desaparecerá. Se trata de un error del algoritmo Eagle, pero se soluciona con otros algoritmos como EPX, 2xSaI y HQ2x.
2×SaI , abreviatura de 2× Scale and Interpolation engine, se inspiró en Eagle. Fue diseñado por Derek Liauw Kie Fa, también conocido como Kreed, principalmente para su uso en emuladores de consolas y computadoras , y ha seguido siendo bastante popular en este nicho. Muchos de los emuladores más populares, incluidos ZSNES y VisualBoyAdvance , ofrecen este algoritmo de escalado como una característica. Hay disponibles varias versiones ligeramente diferentes del algoritmo de escalado, y a menudo se las conoce como Super 2×SaI y Super Eagle .
La familia 2xSaI trabaja en una matriz de píxeles de 4 × 4 donde el píxel marcado con A a continuación está escalado:
IEFJGABK--\ WXHCDL--/YZMinisterio de Obras Públicas
Para píxeles de 16 bits, se utilizan máscaras de píxeles que cambian según el formato de píxeles de 16 bits sea 565 o 555. Las constantes colorMask
, lowPixelMask
, qColorMask
, qLowPixelMask
, redBlueMask
, y greenMask
son máscaras de 16 bits. Los 8 bits inferiores son idénticos en ambos formatos de píxeles.
Se describen dos funciones de interpolación:
INTERPOLAR(uint32 A, UINT32 B).-- punto medio lineal de A y B si (A == B) devuelve A; devolver ( ((A y máscara de color) >> 1) + ((B y máscara de color) >> 1) + (A y B y lowPixelMask) );Q_INTERPOLA(uint32 A, uint32 B, uint32 C, uint32 D)-- interpolación bilineal; promedio de A, B, C y D x = ((A y qMáscaraColor) >> 2) + ((B y qColorMask) >> 2) + ((C y qColorMask) >> 2) + ((D & qColorMask) >> 2); y = (A y qMáscara de píxel bajo) + (Máscara de píxel baja B&q) + (C y qMáscara de píxel bajo) + (D&qLowPixelMask); y = (y >> 2) & qLowPixelMask; devuelve x + y;
El algoritmo comprueba si A, B, C y D coinciden en diagonal de manera que A==D
y B!=C
, o viceversa, si ambas son diagonales o si no coinciden en diagonal. Dentro de estos, comprueba si hay tres o cuatro píxeles idénticos. En función de estas condiciones, el algoritmo decide si utilizar uno de A, B, C o D, o una interpolación solo entre estos cuatro, para cada píxel de salida. El escalador arbitrario 2xSaI puede ampliar cualquier imagen a cualquier resolución y utiliza un filtrado bilineal para interpolar píxeles.
Dado que Kreed publicó [10] el código fuente bajo la Licencia Pública General de GNU , está disponible de forma gratuita para cualquiera que desee utilizarlo en un proyecto publicado bajo esa licencia. Los desarrolladores que deseen usarlo en un proyecto que no esté bajo la Licencia Pública General de GNU tendrían que reescribir el algoritmo sin utilizar ningún código existente de Kreed.
Está disponible en DosBox a través de scaler=2xsai
la opción.
Los hq2x, hq3x y hq4x de Maxim Stepin son para factores de escala de 2:1, 3:1 y 4:1 respectivamente. Cada uno funciona comparando el valor de color de cada píxel con los de sus ocho vecinos inmediatos, marcando los vecinos como cercanos o distantes y utilizando una tabla de búsqueda generada previamente para encontrar la proporción adecuada de los valores de los píxeles de entrada para cada uno de los 4, 9 o 16 píxeles de salida correspondientes. La familia hq3x suavizará perfectamente cualquier línea diagonal cuya pendiente sea ±0,5, ±1 o ±2 y que no esté anti-aliased en la entrada; una con cualquier otra pendiente alternará entre dos pendientes en la salida. También suavizará curvas muy cerradas. A diferencia de 2xSaI, anti-aliased la salida. [11] [8]
hq n x fue creado inicialmente para el emulador de Super NES ZSNES . El autor de bsnes ha publicado una implementación de hq2x que ahorra espacio para el dominio público. [12] Está disponible un puerto para shaders , que tiene una calidad comparable a las primeras versiones de xBR. [13] Antes del puerto, un shader llamado "scalehq" a menudo se confundía con hqx. [14]
Hay 6 filtros en esta familia: xBR , xBRZ , xBR-Hybrid , Super xBR , xBR+3D y Super xBR+3D .
xBR ("escalar por reglas"), creado por Hyllian, funciona de forma muy similar a HQx (basado en el reconocimiento de patrones) y generaría el mismo resultado que HQx cuando se le da el patrón anterior. [15] Sin embargo, va más allá que HQx al utilizar un conjunto de reglas de interpolación de dos etapas , que manejan mejor patrones más complejos como líneas y curvas suavizadas . Las texturas de fondo escaladas mantienen las características nítidas de la imagen original, en lugar de volverse borrosas como tiende a hacer HQx (a menudo ScaleHQ en la práctica). Las versiones más nuevas de xBR son multi-pasada y pueden preservar mejor los pequeños detalles. También hay una versión de xBR combinada con sombreador Reverse-AA llamada xBR-Hybrid. [16] xBR+3D es una versión con una máscara 3D que solo filtra elementos 2D.
xBRZ de Zenju es una versión modificada de xBR. Se implementa desde cero como un filtro basado en CPU en C++ . [17] Utiliza la misma idea básica que el reconocimiento de patrones y la interpolación de xBR, pero con un conjunto de reglas diferente diseñado para preservar detalles finos de la imagen tan pequeños como unos pocos píxeles. Esto lo hace útil para escalar los detalles en las caras y, en particular, en los ojos. xBRZ está optimizado para CPU de múltiples núcleos y arquitecturas de 64 bits y muestra un rendimiento entre un 40 y un 60 % mejor que HQx incluso cuando se ejecuta solo en un núcleo de CPU. [ cita requerida ] Admite escalar imágenes con un canal alfa y escalar por factores enteros desde 2× hasta 6×.
Super xBR [18] [19] es un algoritmo desarrollado por Hylian en 2015. Utiliza algunas combinaciones de filtros lineales conocidos junto con reglas de detección de bordes xBR de forma no lineal. Funciona en dos pasadas y solo puede escalar una imagen por dos (o múltiplos de dos al volver a aplicarlo y también tiene un filtro anti-ringing). Super xBR+3D es una versión con una máscara 3D que solo filtra elementos 2D. También existe una versión Super xBR reescrita en C/C++. [20] [8]
RotSprite es un algoritmo de escalado y rotación de sprites desarrollado por Xenowhirl. Produce muchos menos artefactos que los algoritmos de rotación de vecino más cercano y, al igual que EPX, no introduce nuevos colores en la imagen (a diferencia de la mayoría de los sistemas de interpolación). [21]
El algoritmo primero escala la imagen a 8 veces su tamaño original con un algoritmo Scale2× modificado que trata los píxeles similares (en lugar de los idénticos) como coincidencias. Luego (opcionalmente) calcula qué desplazamiento de rotación utilizar favoreciendo los puntos muestreados que no son píxeles de contorno. A continuación, la imagen rotada se crea con un algoritmo de escalado y rotación de vecino más cercano que simultáneamente reduce la imagen grande a su tamaño original y rota la imagen. Finalmente, los detalles de un solo píxel que se pasaron por alto se restauran (opcionalmente) si el píxel correspondiente en la imagen de origen es diferente y el píxel de destino tiene tres vecinos idénticos. [22]
Fast RotSprite es un algoritmo de rotación rápida para pixel art desarrollado por Oleg Mekekechko para la aplicación Pixel Studio. Está basado en RotSprite pero tiene un mejor rendimiento con una ligera pérdida de calidad. Puede procesar imágenes más grandes en tiempo real. En lugar de aumentar la escala 8×, Fast RotSprite utiliza un único aumento de escala 3×. Luego, simplemente rota todos los píxeles con coordenadas de redondeo. Finalmente, realiza una reducción de escala 3× sin introducir nuevos colores. Como todas las operaciones en cada paso son independientes, se pueden realizar en paralelo para aumentar considerablemente el rendimiento.
El algoritmo Kopf–Lischinski es una nueva forma de extraer gráficos vectoriales independientes de la resolución a partir de pixel art, descrita en el artículo de 2011 “Depixelizing Pixel Art” [23] . Hay disponible una implementación en Python [24] .
El algoritmo se ha adaptado a las GPU y se ha optimizado para la renderización en tiempo real. El código fuente de esta variante está disponible. [25]
La interpolación dirigida por los bordes (EDI) describe técnicas de ampliación que utilizan muestreo estadístico para garantizar la calidad de una imagen a medida que se amplía. [26] [27] Hubo varios métodos anteriores que implicaban la detección de bordes para generar pesos de mezcla para la interpolación lineal o la clasificación de píxeles según sus condiciones vecinas y el uso de diferentes esquemas de interpolación isotrópicos basados en la clasificación. Cada enfoque de interpolación se reduce a promedios ponderados de píxeles vecinos. El objetivo es encontrar los pesos óptimos. La interpolación bilineal establece que todos los pesos sean iguales. Los métodos de interpolación de orden superior, como la interpolación bicúbica o sinc, consideran una mayor cantidad de vecinos que solo los adyacentes.
NEDI (New Edge-Directed Interpolation) calcula covarianzas locales en la imagen original y las utiliza para adaptar la interpolación a alta resolución. Es el filtro prototipo de esta familia. [28]
EDIUpsizer [29] es un filtro de remuestreo que redimensiona una imagen por un factor de dos tanto horizontal como verticalmente usando NEDI (nueva interpolación dirigida por los bordes). [28] EDIUpsizer también usa algunas modificaciones al NEDI básico para evitar muchos de los artefactos que NEDI crea en áreas detalladas. Estas incluyen pruebas de número de condición y tamaño de ventana adaptable, [30] así como restricciones de limitación. Todas las modificaciones y restricciones a NEDI son opcionales (se pueden activar y desactivar) y son configurables por el usuario. Este filtro es bastante lento.
FastEDIUpsizer es una versión reducida de EDIUpsizer que está ligeramente más optimizada para la velocidad. Utiliza un tamaño de ventana constante de 8 × 8 , solo realiza NEDI en el plano de luminancia y solo utiliza interpolación bicúbica o bilineal como método de interpolación de respaldo.
Otro filtro de interpolación orientado a los bordes. Funciona minimizando una función de costo que involucra a cada píxel en una línea de escaneo. Es lento.
EEDI2 redimensiona una imagen en 2× en la dirección vertical copiando la imagen existente a 2⋅y(n) e interpolando el campo faltante. Está pensado para la interpolación dirigida por los bordes para el desentrelazado (es decir, no está diseñado para redimensionar una imagen normal, pero también puede hacerlo). EEDI2 se puede utilizar tanto con TDeint como con TIVTC; consulte el enlace de discusión para obtener más información sobre cómo hacerlo. [31]
Los sombreadores SuperRes [32] utilizan un método de escalado diferente que se puede utilizar en combinación con NEDI (o cualquier otro algoritmo de escalado). El creador Shiandow explica el método en detalle en una publicación del foro de Doom9 en 2014. [33] Este método suele dar mejores resultados que el uso exclusivo de NEDI y rivaliza con los de NNEDI3. Ahora también están disponibles como un script de renderizado MPDN.
NNEDI es una familia de desentrelazadores intracampo que también se pueden utilizar para ampliar imágenes en potencias de dos. Cuando se utiliza como desentrelazador, toma un fotograma , descarta un campo y luego interpola los píxeles faltantes utilizando solo la información del campo conservado. Hasta ahora, existen tres generaciones principales de NNEDI.
NNEDI, la versión original, funciona con entradas YUY2 e YV12 . [34] NNEDI2 agregó compatibilidad con RGB24 y una función especial nnedi2_rpow2
para escalar. NNEDI3 extiende NNEDI2 con una red neuronal predictiva . Tanto el tamaño de la red como el vecindario que examina se pueden ajustar para lograr un equilibrio entre velocidad y calidad: [35]
Esta es una opción de calidad versus velocidad; sin embargo, las diferencias suelen ser pequeñas entre la cantidad de neuronas para un factor de cambio de tamaño específico, sin embargo, la diferencia de rendimiento entre la cantidad de neuronas se hace mayor a medida que cuadriplica el tamaño de la imagen. Si solo planea duplicar la resolución, entonces no verá diferencias masivas entre 16 y 256 neuronas. Todavía hay una diferencia notable entre las opciones más altas y más bajas, pero no órdenes de magnitud diferentes. [36]
{{cite web}}
: CS1 maint: archived copy as title (link)