Los algoritmos de escalado de pixel-art son filtros gráficos que se utilizan a menudo en emuladores de consolas de videojuegos para mejorar los gráficos de pixel art en 2D dibujados a mano . El cambio de escala del pixel art es un subcampo especializado en el cambio de escala de imágenes .
Como los gráficos de pixel art suelen tener resoluciones muy bajas , se basan en la colocación cuidadosa de píxeles individuales, a menudo con una paleta de colores limitada. Esto da como resultado gráficos que se basan en una gran cantidad de señales visuales estilizadas para definir formas complejas con muy poca resolución, hasta píxeles individuales y haciendo que el escalado de imágenes del arte de píxeles sea un problema particularmente difícil.
Se han desarrollado varios algoritmos especializados [1] para manejar gráficos de pixel art, ya que los algoritmos de escalado tradicionales no tienen en cuenta estas señales de percepción.
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 consolas, muchos están diseñados para ejecutarse en tiempo real para imágenes de entrada suficientemente pequeñas a 60 cuadros por segundo . Esto impone limitaciones al tipo de técnicas de programación que se pueden utilizar para este tipo de procesamiento en tiempo real. Muchos trabajan solo en factores de escala específicos: 2 × es el más común, con 3 ×, 4 ×, 5 × y 6 × también presentes.
Algoritmos
SAA5050 'suavizado diagonal'
El chip generador de caracteres de teletexto Mullard SAA5050 (1980) utilizó un algoritmo de escalado de píxeles primitivo 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, la forma de cada carácter se definió en una cuadrícula de 5 × 9 píxeles, que luego se interpoló suavizando diagonales para dar un carácter de 10 × 18 píxeles, con una forma característicamente angular, rodeada en la parte superior y hacia la izquierda por dos píxeles de espacio en blanco. . El algoritmo solo funciona con datos de origen monocromáticos y asume que los píxeles de origen serán lógicamente verdaderos o falsos dependiendo de si están "activados" o "desactivados". Se supone que los píxeles "fuera del patrón de cuadrícula" están apagados. [2] [3] [4]
El algoritmo funciona de la siguiente manera:
ABC - \ 1 2DEF - / 3 41 = B | (A & E &! B &! D)2 = B | (C & E &! B &! F)3 = E | (! A &! E & B & D)4 = E | (! C &! E & B & F)
Tenga en cuenta que este algoritmo, como el algoritmo de Eagle que se muestra a continuación, tiene un defecto: si aparece un patrón de 4 píxeles en forma de diamante hueco, la expansión borrará el hueco. La ROM de caracteres internos del SAA5050 evita cuidadosamente el uso de este patrón.
El caso degenerado: ** * * | se convierte en: ** **** ************ **** ** |
EPX / Scale2 × / AdvMAME2 ×
Eric's Pixel Expansion (EPX) es un algoritmo desarrollado por Eric Johnston en LucasArts alrededor de 1992, cuando se trasladaron los juegos del motor SCUMM de la PC IBM (que funcionaba a 320 × 200 × 256 colores) a las primeras computadoras Macintosh en 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 basados en el 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 ×, desarrollado alrededor de 2001) tienen una implementación ligeramente más eficiente pero funcionalmente idéntica:
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 solo EPX aplicado dos veces para obtener una resolución de 4 ×.
Scale3 × / AdvMAME3 × y ScaleFX
El algoritmo AdvMAME3 × / Scale3 × (disponible en DOSBox a través de la opción scaler=advmame3x
dosbox.conf ) se puede considerar 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 hay una variante mejorada sobre Scale3 × llamada ScaleFX, desarrollada por Sp00kyFox, y una versión combinada con Reverse-AA llamada ScaleFX-Hybrid. [6] [7]
Águila
Eagle funciona de la siguiente manera: por cada píxel, generaremos 4 píxeles. Primero, establezca los 4 en el color del píxel que estamos escalando actualmente (como vecino más cercano). A continuación, mire los tres píxeles de arriba, a la izquierda y diagonalmente arriba a la izquierda: si los tres son del mismo color entre sí, establezca el píxel superior izquierdo de nuestro cuadrado de salida en ese color con preferencia al color vecino más cercano. Trabaje de manera similar para los cuatro píxeles y luego pase al siguiente. [8]
Suponga una matriz de entrada de 3 × 3 píxeles donde el píxel más central es el píxel 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á. Este es un error en el algoritmo Eagle, pero se resuelve con otros algoritmos como EPX, 2xSaI y HQ2x.
2 × SaI
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 consola y computadora , y se ha mantenido bastante popular en este nicho. Muchos de los emuladores más populares, incluidos ZSNES y VisualBoyAdvance , ofrecen este algoritmo de escalado como característica. Hay disponibles varias versiones ligeramente diferentes del algoritmo de escalado, que a menudo se denominan Super 2 × SaI y Super Eagle .
La familia 2xSaI trabaja en una matriz de píxeles de 4 × 4 donde se escala el píxel marcado con A a continuación:
IEFJGABK - \ WXHCDL - / YZM N O P
Para los píxeles de 16 bits, que utilizan máscaras de píxeles que cambian en función de si el formato de píxel de 16 bits es 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 cualquier formato de píxel.
Se describen dos funciones de interpolación:
INTERPOLAR (uint32 A, UINT32 B) si (A == B) devuelve A; regreso ( ((A & colorMask) >> 1) + ((B y máscara de color) >> 1) + (A y B y lowPixelMask));Q_INTERPOLATE (uint32 A, uint32 B, uint32 C, uint32 D) x = ((A & qColorMask) >> 2) + ((B & qColorMask) >> 2) + ((C & qColorMask) >> 2) + ((D & qColorMask) >> 2); y = (A & qLowPixelMask) + (B & qLowPixelMask) + (C & qLowPixelMask) + (D & qLowPixelMask); y = (y >> 2) & qLowPixelMask; return x + y;
El algoritmo comprueba A, B, C y D para una coincidencia diagonal tal que A==D
y B!=C
, o al revés, o si ambas son diagonales, o si no hay coincidencia diagonal. Dentro de estos, busca 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 entre solo 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.
Desde que Kreed publicó [9] el código fuente bajo la Licencia Pública General GNU , está disponible gratuitamente para cualquiera que desee utilizarlo en un proyecto publicado bajo esa licencia. Los desarrolladores que deseen utilizarlo en un proyecto que no sea GPL deberán volver a escribir el algoritmo sin utilizar el código existente de Kreed.
Está disponible en DosBox a través de la scaler=2xsai
opción.
hq n x familia
Los valores 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 a los vecinos como cercanos o distantes y usando una tabla de búsqueda pregenerada para encontrar la proporción adecuada de valores de 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é suavizada 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, suaviza la salida. [10]
Imagen ampliada 3 × con la interpolación del vecino más cercano
Imagen ampliada 3 × con algoritmo hq3x
hq n x se creó inicialmente para el emulador de Super NES ZSNES . El autor de bsnes ha publicado una implementación de hq2x que ahorra espacio al dominio público. [11] Está disponible un puerto para sombreadores , que tiene una calidad comparable a las primeras versiones de xBR. [12] Antes del puerto, un sombreador llamado "scalehq" a menudo se confundía con hqx. [13]
familia xBR
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 la misma manera que HQx (basado en el reconocimiento de patrones), y generaría el mismo resultado que HQx cuando se le da el patrón anterior. [14] Sin embargo, va más allá que HQx al usar un conjunto de reglas de interpolación de 2 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 recientes de xBR son de múltiples pasadas y pueden preservar mejor los pequeños detalles. También hay una versión de xBR combinada con el sombreador Reverse-AA llamada xBR-Hybrid. [15] xBR + 3D es una versión con 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 ++ . [16] Utiliza la misma idea básica que el reconocimiento de patrones e interpolación de xBR, pero con un conjunto de reglas diferente diseñado para preservar los detalles finos de la imagen tan pequeños como unos pocos píxeles. Esto lo hace útil para escalar los detalles de las caras y, en particular, de los ojos. xBRZ está optimizado para CPU de varios núcleos y arquitecturas de 64 bits y muestra un rendimiento entre un 40% y un 60% mejor que HQx incluso cuando se ejecuta en un solo 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 [17] [18] 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 en dos (o múltiplos de dos volviéndola a aplicar y también tiene filtro anti-ring). Super xBR + 3D es una versión con máscara 3D que solo filtra elementos 2D. También hay una versión Super xBR reescrita en C / C ++. [19]
RotSprite
RotSprite es un algoritmo de escalado y rotación para sprites desarrollado por Xenowhirl. Produce muchos menos artefactos que los algoritmos de rotación del vecino más cercano y, como EPX, no introduce nuevos colores en la imagen (a diferencia de la mayoría de los sistemas de interpolación). [20]
El algoritmo primero escala la imagen a 8 veces su tamaño original con un algoritmo Scale2 × modificado que trata píxeles similares (en lugar de idénticos) como coincidencias. Luego (opcionalmente) calcula qué desplazamiento de rotación usar al favorecer los puntos muestreados que no son píxeles de límite. A continuación, la imagen rotada se crea con un algoritmo de rotación y escala del vecino más cercano que simultáneamente encoge la imagen grande a su tamaño original y rota la imagen. Finalmente, los detalles de un solo píxel que se pasan 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. [21]
Rápido RotSprite
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. Es capaz de procesar imágenes más grandes en tiempo real. En lugar del 8x de nivel superior, Fast RotSprite utiliza un solo 3x de nivel superior. Luego, simplemente gira todos los píxeles con coordenadas de redondeo. Finalmente, realiza una reducción de escala de 3 veces sin introducir nuevos colores. Como todas las operaciones de cada paso son independientes, se pueden realizar en paralelo para aumentar considerablemente el rendimiento.
Kopf – Lischinski
El algoritmo de Kopf-Lischinski es una forma novedosa de extraer gráficos vectoriales independientes de la resolución del pixel art descrito en el artículo de 2011 "Depixelizing Pixel Art". [22] Hay disponible una implementación de Python. [23]
El algoritmo ha sido adaptado a GPU y optimizado para renderizado en tiempo real. El código fuente está disponible para esta variante. [24]
Interpolación dirigida por bordes (EDI)
La interpolación dirigida por bordes (EDI) describe técnicas de escalado que utilizan muestreo estadístico para garantizar la calidad de una imagen al escalarla. [25] [26] Había varios métodos anteriores que involucraban la detección de bordes para generar pesos de mezcla para la interpolación lineal o clasificar píxeles de acuerdo con sus condiciones vecinas y usar diferentes esquemas de interpolación isotrópicos basados en la clasificación. Cualquier enfoque de interpolación dado se reduce a promedios ponderados de píxeles vecinos. El objetivo es encontrar 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 un número mayor de vecinos que solo los adyacentes.
NEDI
NEDI (New Edge-Directed Interpolation) calcula las covarianzas locales en la imagen original y las utiliza para adaptar la interpolación a alta resolución. Es el filtro prototípico de esta familia. [27]
EDIUpsizer
EDIUpsizer [28] es un filtro de remuestreo que aumenta el tamaño de una imagen en un factor de dos tanto horizontal como verticalmente utilizando NEDI (nueva interpolación dirigida por bordes). [27] EDIUpsizer también usa algunas modificaciones al NEDI básico para evitar muchos de los artefactos que NEDI crea en áreas detalladas. Estos incluyen pruebas de número de condición y tamaño de ventana adaptable, [29] así como restricciones de límites. Todas las modificaciones y restricciones de NEDI son opcionales (se pueden activar y desactivar) y son configurables por el usuario. Solo tenga en cuenta que este filtro es bastante lento
FastEDIUpsizer
FastEDIUpsizer es una versión reducida de EDIUpsizer que está un poco más ajustada a 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 retroceso.
eedi3
Otro filtro de interpolación dirigido por bordes. Funciona minimizando un costo funcional que involucra cada píxel en una línea de escaneo. Es lento.
EEDI2
EEDI2 cambia el tamaño de una imagen 2 × en la dirección vertical copiando la imagen existente a 2⋅y (n) e interpolando el campo que falta. Está diseñado para la interpolación dirigida por los bordes para el desentrelazado (es decir, no está hecho para cambiar el tamaño de 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 hacer esto. [30]
SuperRes
Los sombreadores SuperRes [31] utilizan un método de escalado diferente que se puede utilizar en combinación con NEDI (o cualquier otro algoritmo de escalado). Este método se explica en detalle aquí. [32] Este método parece dar mejores resultados que el simple uso de NEDI y rivaliza con los de NNEDI3. Ahora también están disponibles como un renderizado MPDN.
NNEDI
NNEDI es una familia de desentrelazadores intracampo que también se pueden utilizar para ampliar imágenes con 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 guardado. Hasta ahora hay tres generaciones principales de NNEDI.
NNEDI, la versión original, funciona con entrada YUY2 e YV12. [33] NNEDI2 agregó soporte RGB24 y una función especial nnedi2_rpow2
para escalado. NNEDI3 mejora NNEDI2 con una red neuronal predictiva . Tanto el tamaño de la red como el vecindario que examina se pueden modificar para lograr una compensación entre velocidad y calidad: [34]
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 el recuento de neuronas aumenta a medida que cuadruplica el tamaño de la imagen. Si solo planea duplicar la resolución, 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 diferentes órdenes de magnitud. [35]
Referencias
- ^ "Escaladores de píxeles" . Consultado el 19 de febrero de 2016 .
- ^ "Hoja de datos de Mullard SAA5050" (PDF) .
- ^ "SAA5050 Suavizar el código fuente del proyecto MAME" .
- ^ "Publicación en el foro que muestra la página de prueba de referencia de teletexto en el chip SAA5050" .
- ^ Thomas, Kas (1999). "Estrategias de Fast Blit: una guía del programador de Mac" . MacTech .
- ^ libretro. "common-shaders / scalenx en master · libretro / common-shaders · GitHub" . GitHub . Consultado el 19 de febrero de 2016 .
- ^ "ScaleNx - Mejora de algoritmos y eliminación de artefactos [Archivo]" . Archivado desde el original el 27 de mayo de 2016 . Consultado el 27 de mayo de 2016 .
- ^ "Águila (idea)" . Todo 2 . 2007-01-18.
- ^ "Página de inicio de Kreed: 2xSaI" . Consultado el 25 de abril de 2020 .
- ^ Stepin, Maxim. "Filtro de ampliación hq3x" . Archivado desde el original el 3 de julio de 2007 . Consultado el 3 de julio de 2007 .
- ^ Byuu. Anuncio de lanzamiento Consultado el 14 de agosto de 2011.
- ^ libretro. "common-shaders / hqx en master · libretro / common-shaders · GitHub" . GitHub . Consultado el 19 de febrero de 2016 .
- ^ Hunter K. "Pantalones sucios: un blog informático" . Consultado el 19 de febrero de 2016 .
- ^ "Tutorial del algoritmo xBR" . 2012-09-18 . Consultado el 19 de febrero de 2016 .
- ^ libretro. "common-shaders / xbr en master · libretro / common-shaders · GitHub" . GitHub . Consultado el 19 de febrero de 2016 .
- ^ zenju. "xBRZ" . SourceForge . Consultado el 19 de febrero de 2016 .
- ^ "Super-xBR.pdf" . Documentos de Google . Consultado el 19 de febrero de 2016 .
- ^ libretro. "common-shaders / xbr / shaders / super-xbr en master · libretro / common-shaders · GitHub" . GitHub . Consultado el 19 de febrero de 2016 .
- ^ "Super-XBR portado a C / C ++ (solo versión Fast Shader))" . 6 de marzo de 2016.
- ^ "RotSprite" . Sonic Retro . Consultado el 19 de febrero de 2016 .
- ^ "Utilidad de rotación de Sprite" . Tablero de mensajes retro de Sonic y Sega . Consultado el 19 de febrero de 2016 .
- ^ Johannes Kopf y Dani Lischinski (2011). "Depixelizing pixel art" . Transacciones ACM en gráficos . SIGGRAPH . 30 (4): 99: 1–99: 8. doi : 10.1145 / 2010324.1964994 . Consultado el 22 de mayo de 2016 .
- ^ Vemula, Anirudh; Yeddu, Vamsidhar (29 de abril de 2019). "Pixel-Art: Implementamos el famoso papel" Depixelizing Pixel Art "de Kopf y Lischinski" .
- ^ Kreuzer, Felix; Kopf, Johannes; Wimmer, Michael (2015). "Depixelizing Pixel Art en tiempo real" . Actas del XIX Simposio sobre gráficos y juegos interactivos en 3D . ACM: 130. doi : 10.1145 / 2699276.2721395 . ISBN 9781450333924.
- ^ "Interpolación dirigida al borde" . chiranjivi.tripod.com . Consultado el 7 de mayo de 2019 .
- ^ "Implementación Shader del algoritmo NEDI - Foro de Doom9" . forum.doom9.org . Consultado el 7 de mayo de 2019 .
- ^ a b Li, Xin (26 de noviembre de 2010). "Nueva interpolación dirigida al borde" (PDF) . Archivado desde el original (PDF) el 26 de noviembre de 2010 . Consultado el 7 de mayo de 2019 .
- ^ Filtros Avisynth de tritical
- ^ https://web.archive.org/web/20041221052401/http://www.cs.ucdavis.edu/~bai/ECS231/finaltzeng.pdf
- ^ "TDeint y TIVTC - Página 21 - Foro de Doom9" . Consultado el 19 de febrero de 2016 .
- ^ "nnedi3 vs NeuronDoubler - Foro de Doom9" . Consultado el 19 de febrero de 2016 .
- ^ "Implementación Shader del algoritmo NEDI - Página 6 - Foro de Doom9" . Consultado el 19 de febrero de 2016 .
- ^ "NNEDI - filtro de desentrelazado intra-campo - Foro de Doom9" . Consultado el 19 de febrero de 2016 .
- ^ "Nnedi3" . AviSynth . Consultado el 7 de mayo de 2019 .
- ^ tritical (2019-04-30), nnedi3 - Readme.txt , consultado el 2019-05-07
Ver también
- libretro : implementa muchos de los algoritmos mencionados anteriormente como sombreadores