Como cualquier fotógrafo aficionado puede decirle, el postprocesamiento extremo siempre es bueno. Una de esas técnicas se llama " falsificación en miniatura ".
El objetivo es hacer que una imagen parezca una fotografía de una versión miniaturizada de juguete de sí misma. Esto funciona mejor para fotografías tomadas desde un ángulo moderado / alto al suelo, con una baja variación en la altura del sujeto, pero se puede aplicar con eficacia variable a otras imágenes.
El desafío: tomar una fotografía y aplicarle un algoritmo de simulación en miniatura. Hay muchas maneras de hacer esto, pero a los efectos de este desafío, se reduce a:
Desenfoque selectivo
Alguna parte de la imagen debe ser borrosa para simular una profundidad de campo poco profunda. Esto generalmente se realiza a lo largo de algún gradiente, ya sea lineal o con forma. Elija el algoritmo de desenfoque / gradiente que desee, pero entre el 15 y el 85% de la imagen debe tener un desenfoque "notable".
Impulso de saturación
Sube el color para que las cosas parezcan pintadas a mano. La salida debe tener un nivel de saturación promedio de> + 5% en comparación con la entrada. (usando saturación de HSV )
Aumento de contraste
Aumente el contraste para simular condiciones de iluminación más severas (como se ve con una luz interior / de estudio en lugar de con el sol). La salida debe tener un contraste de> + 5% en comparación con la entrada. (usando el algoritmo RMS )
Esas tres alteraciones deben implementarse y no se permiten otras mejoras / alteraciones. Sin recorte, afilado, ajustes de balance de blancos, nada.
La entrada es una imagen y se puede leer desde un archivo o memoria. Puede usar bibliotecas externas para leer y escribir la imagen, pero no puede usarlas para procesar la imagen. Las funciones suministradas también están prohibidas para este propósito (no puede llamar,
Image.blur()
por ejemplo)No hay otra entrada. Las fuerzas de procesamiento, los niveles, etc., deben ser determinados por el programa, no por un humano.
La salida se puede mostrar o guardar como un archivo en un formato de imagen estandarizado (PNG, BMP, etc.).
Intenta generalizar. No debería funcionar en una sola imagen, pero es comprensible que no funcione en todas las imágenes. Algunas escenas simplemente no responden bien a esta técnica, no importa cuán bueno sea el algoritmo. Aplica el sentido común aquí, tanto al responder como al votar por las respuestas.
El comportamiento no está definido para entradas no válidas y aquellas imágenes que son imposibles de satisfacer la especificación. Por ejemplo, una imagen en escala de grises no se puede saturar (no hay un tono base), una imagen en blanco puro no puede tener un mayor contraste, etc.
Incluya al menos dos imágenes de salida en su respuesta:
Uno debe generarse a partir de una de las imágenes en esta carpeta de Dropbox . Hay seis para elegir, pero intenté hacerlos viables en distintos grados. Puede ver resultados de muestra para cada uno en la
example-outputs
subcarpeta. Tenga en cuenta que estas son imágenes JPG completas de 10MP directamente de la cámara, por lo que tiene muchos píxeles para trabajar.El otro puede ser cualquier imagen de su elección. Obviamente, trate de elegir imágenes que se puedan usar libremente. Además, incluya la imagen original o un enlace para compararla.
Por ejemplo, de esta imagen:
Puede generar algo como:
Como referencia, el ejemplo anterior se procesó en GIMP con un desenfoque gaussiano de gradiente angular en forma de caja, saturación +80, contraste +20. (No sé qué unidades usa GIMP para esos)
Para obtener más inspiración o para tener una mejor idea de lo que está tratando de lograr, consulte este sitio o este . También puede buscar miniature faking
y tilt shift photography
ejemplos.
Este es un concurso de popularidad. Votantes, voten por las entradas que sientan mejor mientras se mantienen fieles al objetivo.
Aclaración:
Aclarando qué funciones están prohibidas, no era mi intención prohibir las funciones matemáticas . Era mi intención prohibir las funciones de manipulación de imágenes . Sí, hay cierta superposición allí, pero cosas como FFT, convoluciones, matemática matricial, etc., son útiles en muchas otras áreas. Usted debe no estar utilizando una función que simplemente toma una imagen y borrones. Si encuentras una forma matemática adecuada para crear un desenfoque, ese juego justo.
fuente
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, yImageAdjust
.) Incluso con la ayuda de las funciones de procesamiento de imágenes de alto nivel, el código lleva hasta 22 k. Sin embargo, el código para la interfaz de usuario es muy pequeño.Respuestas:
Java: Implementación de referencia
Aquí hay una implementación de referencia básica en Java. Funciona mejor en tomas de alto ángulo, y es terriblemente ineficiente.
El desenfoque es un desenfoque de cuadro muy básico, por lo que recorre los mismos píxeles mucho más de lo necesario. El contraste y la saturación también podrían combinarse en un solo bucle, pero la gran mayoría del tiempo invertido es en desenfoque, por lo que no vería mucha ganancia de eso. Dicho esto, funciona bastante rápido en imágenes de menos de 2MP. La imagen de 10MP tardó un tiempo en completarse.
La calidad del desenfoque podría mejorarse fácilmente utilizando básicamente cualquier cosa menos un desenfoque de caja plana. Los algoritmos de contraste / saturación hacen su trabajo, por lo que no hay quejas reales allí.
No hay inteligencia real en el programa. Utiliza factores constantes para el desenfoque, la saturación y el contraste. Jugué con él para encontrar configuraciones medianas felices. Como resultado, no hay algunas escenas que no lo hacen muy bien. Por ejemplo, bombea tanto el contraste / saturación que las imágenes con grandes áreas de colores similares (piense en el cielo) se dividen en bandas de color.
Es simple de usar; simplemente pase el nombre del archivo como único argumento. Sale en PNG independientemente de cuál sea el archivo de entrada.
Ejemplos:
De la selección de dropbox:
Estas primeras imágenes se reducen para facilitar su publicación. Haga clic en la imagen para verla en tamaño completo.
Después:
Antes de:
Selección miscelánea:
Después:
Antes de:
fuente
DO#
En lugar de hacer cuadros borrosos iterativos, decidí seguir todo el camino y escribir un desenfoque gaussiano. Las
GetPixel
llamadas realmente se ralentizan cuando se usan núcleos grandes, pero realmente no vale la pena convertir los métodos a usar aLockBits
menos que procesemos algunas imágenes más grandes.A continuación se muestran algunos ejemplos, que utilizan los parámetros de ajuste predeterminados que configuré (no jugué mucho con los parámetros de ajuste, porque parecían funcionar bien para la imagen de prueba).
Para el caso de prueba proporcionado ...
Otro...
Otro...
Los aumentos de saturación y contraste deben ser bastante sencillos del código. Hago esto en el espacio HSL y lo convierto de nuevo a RGB.
El núcleo Gaussiano 2D se genera en función del tamaño
n
especificado, con:... y normalizado después de que se asignan todos los valores del núcleo. Tenga en cuenta que
A=sigma_x=sigma_y=1
.Para averiguar dónde aplicar el núcleo, utilizo un peso borroso, calculado por:
... lo que da una respuesta decente, esencialmente creando una elipse de valores que están protegidos del desenfoque que gradualmente se desvanece más. Un filtro de paso de banda combinado con otras ecuaciones (quizás alguna variante de
y=-x^2
) podría funcionar mejor aquí para ciertas imágenes. Fui con el coseno porque dio una buena respuesta para el caso base que probé.fuente
Java
Utiliza un desenfoque de caja bidireccional de promedio rápido para ser lo suficientemente rápido como para ejecutar múltiples pases, emulando un desenfoque gaussiano. El desenfoque es un gradiente elíptico en lugar de bi-lineal también.
Visualmente, funciona mejor en imágenes grandes. Tiene un tema más oscuro y sucio. Estoy contento con cómo resultó el desenfoque en imágenes de tamaño apropiado, es bastante gradual y difícil de discernir dónde "comienza".
Todos los cálculos realizados en matrices de enteros o dobles (para HSV).
Espera la ruta del archivo como argumento, envía el archivo a la misma ubicación con el sufijo "miniaturized.png" También muestra la entrada y la salida en un JFrame para su visualización inmediata.
(haga clic para ver versiones grandes, son mucho mejores)
Antes de:
Después:
Puede que tenga que agregar un mapeo de tonos más inteligente o preservación de luma, ya que puede oscurecer bastante:
Antes de:
Después:
Sin embargo, sigue siendo interesante, lo pone en una atmósfera completamente nueva.
El código:
fuente
J
Este fue un buen desafío. La configuración de desenfoque, saturación y contraste está codificada pero puede cambiarse fácilmente si lo desea. Sin embargo, el área en foco está codificada como una línea horizontal en el centro. No se puede modificar simplemente como las otras configuraciones. Fue elegido ya que la mayoría de las imágenes de prueba presentan vistas de una ciudad.
Después de realizar un desenfoque gaussiano, dividí la imagen horizontalmente en 5 regiones. Las regiones superior e inferior recibirán el 100% del desenfoque. La región central recibirá el 0% del desenfoque. Las dos regiones restantes se escalarán proporcionalmente al cubo inverso del 0% al 100%.
El código se utilizará como un script en J y ese script estará en la misma carpeta
input.bmp
que será la imagen de entrada. Crearáoutput.bmp
cuál será una miniatura falsa de la entrada.El rendimiento es bueno y en mi PC con un i7-4770k, tarda unos 20 segundos en procesar una imagen desde el conjunto del OP. Anteriormente, se tardaban unos 70 segundos en procesar una imagen utilizando una convolución estándar con el
;._3
operador de submatriz. El rendimiento se mejoró mediante el uso de FFT para realizar convolución.Este código requiere que se instalen los complementos
bmp
ymath/fftw
. Puede instalarlos usandoinstall 'bmp'
yinstall 'math/fftw'
. Su sistema también puede necesitar lafftw
biblioteca para ser instalada.fuente