algorithm - neighbor - ¿Cuál es el nombre de este algoritmo y cómo se compara con otros algoritmos de remuestreo de imágenes?
bivariate interpolation (5)
El algoritmo que ha indicado se denomina algoritmo de promediado de área , es un algoritmo que rara vez se aplica para reducir las imágenes.
Una variante más simple de esta se usa como una técnica anti-alias para suavizar imágenes renderizadas en juegos de computadora.
El algoritmo para esta técnica se llama Supersampling
Gracias a @Guffa para señalarlo, es una simplificación del algoritmo anterior, ya que requiere puntos de muestra y podría perder ciertos colores, o elegir un color más veces que otro aunque no sea el más dominante.
El algoritmo anterior es igual a un muestreo de puntos infinitos del algoritmo de supermuestreo.
Actualización: Acabo de notar que incluso Java aprecia su algoritmo :)
AreaAveragingScaleFilter
Este algoritmo ha estado en mi mente durante mucho tiempo, pero no puedo encontrarlo descrito en ningún lado. Sin embargo, es tan simple que no puedo ser el único que ha pensado en ello. Así es como funciona:
Comienzas con una imagen. Digamos, 7x7px:
Debe volver a muestrear, por ejemplo, a 5x5px:
Entonces, todo lo que haces es tomar el color promedio de cada nuevo cuadrado:
Este no es el vecino más cercano, porque toma el color de solo un píxel, no píxeles fraccionarios que superponen el píxel fuente. Tampoco es bilineal, bicúbico, lanczos ni nada que se pueda interpolar.
¿Así que qué es lo? Intuitivamente me parece que este debería ser el algoritmo de remuestreo "matemáticamente perfecto", aunque como no tengo una definición de lo que es "matemáticamente perfecto", no puedo probarlo o desaprobarlo.
Por último, "matemáticamente perfecto" no siempre es "lo mejor", así que me pregunto cómo se compara con otros algoritmos de remuestreo de imágenes convencionales (bicúbicos, lanczos) en términos de "calidad". Este es un término subjetivo, por supuesto, así que estoy realmente interesado si hay diferencias significativas entre este algoritmo y otros, que la mayoría de la gente estaría de acuerdo.
PD. Algunas cosas que ya puedo decir al respecto - no será "lo mejor" para el arte de píxeles, como se demuestra aquí; hay algoritmos especiales para eso (2xSAI, etc.); y tampoco será lo mejor para agrandar las imágenes: la interpolación ganaría allí. Pero para reducir las imágenes ...?
Actualización 1: Mmm, acaba de enterarme del supermuestreo . Esto parece una variante del mismo, con una disposición de muestras de tipo cuadrícula, donde el número de muestras se optimiza para la resolución de las imágenes de origen y destino.
Su descripción no me recuerda un algoritmo, lo más probable es que sea la estructura de datos y el tipo de datos. Me recuerda a un árbol de kd o un quadtree. Un kd-tree o quadtree puede ayudarlo a resolver su problema con el vecino más cercano. Sin embargo, si desea una función matemática para las cuadrículas, también puede observar las curvas de relleno de espacio, especialmente las curvas de morton en orden z. Esto funciona muy bien para potencia de 2 y reduce la complejidad 2d. La función es f (x, y) = (f (x), f (y)).
Tampoco es bilineal
Sí, en realidad lo es. El remuestreo bilineal es solo una interpolación lineal en dos dimensiones.
Lo está describiendo como obtener el color promedio de la superficie del píxel, pero la interpolación de los píxeles circundantes es una manera mucho más sencilla de calcular el mismo valor.
La interpolación se realiza una dimensión a la vez, por lo que solo calcula superposición de lados en lugar de áreas superpuestas, lo que es mucho más simple.
Empezaré diciendo que no conozco un nombre oficial para tu algoritmo. Sé que Paint Shop Pro lo llamó "Bilinear" desde el principio, pero se vio obligado a cambiarle el nombre a "Promedio ponderado" en la versión 8 cuando se señaló que el algoritmo no coincidía con la definición clásica de Bilinear.
La mayoría de los algoritmos de cambio de tamaño se pueden aplicar en dos pases independientes, uno en la dirección X y otro en la Y. Esto no solo es más eficiente, sino que facilita mucho más describir y razonar sobre los diferentes algoritmos. De ahora en adelante, voy a trabajar en una dimensión y supongo que puedes extrapolar a 2D.
Su entrada consta de 7 píxeles a los que daremos coordenadas de 0, 1, 2, 3, 4, 5, 6. Es útil darse cuenta de que un píxel no es un poco cuadrado en este contexto, sino que es un solo punto. Para crear la salida, querrá los valores interpolados de los puntos 0.2, 1.6, 3.0, 4.4, 5.8. ¿Por qué no 0.0, 1.5, 3.0, 4.5, 6.0? Supongamos que dobla el tamaño de la entrada y la salida a 14x14 y 10x10: las coordenadas ahora serían 0.0, 1.44, 2.89, 4.33, 5.78, 7.22, 8.67, 10.11, 11.56, 13.0. Comenzando con el segundo píxel, los resultados serían diferentes, y eso es inaceptable. Todos los puntos deben estar separados por 7/5, dando las coordenadas 0.2, 1.6, 3.0, 4.4, 5.8, 7.2, 8.6, 10.0, 11.4, 12.8.
Comparemos los algoritmos comunes de cambio de tamaño cuando se expresan como un filtro, y vemos cómo se comparan con los suyos.
Este primer ejemplo en forma genérica se llama filtro de caja o promedio. Pero sucede algo mágico cuando el ancho del filtro de caja es exactamente 1.0: un píxel de la entrada va a caer dentro de la caja y se le dará un peso de 1.0, y todos los otros píxeles de la entrada tendrán un peso de 0.0 . Esto lo convierte en el equivalente del algoritmo del vecino más cercano.
Nuestro segundo ejemplo se llama genéricamente el filtro Tienda. Nuevamente se convierte en algo especial cuando el ancho es exactamente 2.0, se convierte en una interpolación lineal; aplicado en 2D se llama Bilinear.
El tercer ejemplo es un filtro cúbico, que cuando se aplica en 2D se llama Bicúbico. Hay diferentes variaciones de esta fórmula, este ejemplo usa el sugerido por Mitchell y Netravali.
Si bien el filtro Gaussian no se usa a menudo para redimensionar aplicaciones, lo agregué aquí para compararlo.
Finalmente llegamos a tu algoritmo. Es una combinación de promediado y bilineal, una carpa con una parte superior plana.
Al contrario de lo que leo en otras respuestas, este algoritmo es bastante popular para el supermuestreo, al menos en la comunidad de procesamiento de imágenes.
Se implementa en la biblioteca de Intel® Performance Primitives bajo el nombre Super Sampling ; el nombre (bastante desinformativo) es una forma de indicar que no existe un algoritmo alternativo para supersampling en la biblioteca. En OpenCV, se INTER_AREA
con el nombre INTER_AREA
; está incluido entre otros tipos de interpolación, lo que podría sugerir que son intercambiables, pero mencionan que " puede ser un método preferido para la destrucción de imágenes ", una declaración bastante conservadora para mi gusto.
Cuando supersamplea una imagen por un factor entero, digamos por un factor de dos, tomar la media de los píxeles subyacentes para la imagen resultante es realmente óptima en un sentido específico.
Supongamos que su imagen se obtiene mediante una medida cuantitativa de una señal mediante una grilla de receptores. Por ejemplo, fotografías o rayos X, contando el número de fotones. Los valores de píxel son proporcionales a la cantidad de señal recibida por un receptor determinado.
Si supone que su cámara es perfecta, sin dispersión de la señal, cobertura del 100% del área de recepción, entonces el supermuestreo medio es óptimo porque proporciona la imagen exacta que recibiría una cámara perfecta con la mitad de resolución.
El promedio de área es una generalización simple de este supermuestreo medio óptimo a relaciones no enteras, lo que explica su popularidad, aunque no puede presumir de la misma propiedad para cualquier proporción de supersampling que no sean números enteros.