En un popular software de edición de imágenes hay una característica, que los parches (el término utilizado en el procesamiento de imágenes es pintar como señaló @ mınxomaτ). Un área seleccionada de una imagen, basada en la información fuera de ese parche. Y hace un trabajo bastante bueno, considerando que es solo un programa. Como humano, a veces puedes ver que algo está mal, pero si aprietas los ojos o solo echas un vistazo, el parche parece llenar el vacío bastante bien.
Desafío
Dada una imagen y una máscara que especifica un área rectangular de la imagen debe ser parcheada (también como imagen, o cualquier otro formato preferido), su programa debe tratar de llenar el área especificada con un parche que intente mezclarse con el resto de la imagen. El programa no puede usar la información de la imagen original que estaba dentro del área especificada.
Puede suponer que el parche siempre está al menos a lo ancho de los lados y a una altura de la parte superior e inferior de la imagen. Eso significa que el área máxima de un parche es 1/9 de la imagen completa.
Agregue una breve descripción sobre cómo funciona su algoritmo.
Votación
Se les pide a los votantes que juzguen qué tan bien funcionan los algoritmos y voten en consecuencia.
Algunas sugerencias sobre cómo juzgar: (De nuevo, gracias @ mınxomaτ por algunos criterios más).
- Si entrecierra los ojos y la imagen se ve bien?
- ¿Puedes decir exactamente dónde está el parche?
- ¿Qué tan bien continúan las estructuras y texturas del fondo de la imagen y el área circundante?
- ¿Cuántos píxeles perdidos de color falso contiene el área editada?
- ¿Hay manchas / bloques de colores uniformes en el área que no parecen pertenecer allí?
- ¿El área editada tiene cambios drásticos de color / contraste o brillo en comparación con el resto de la imagen?
Criterio de validez
Para que un envío sea válido, la imagen de salida debe coincidir exactamente con la imagen de entrada fuera del área especificada.
Caso de prueba
A la izquierda la imagen de origen, a la derecha la máscara correspondiente:
inpaint.exe left top width height img.jpg
)?Respuestas:
AutoIt , VB
Introducción
Esta es una implementación de la eliminación de objetos mediante el algoritmo de pintura basado en ejemplos desarrollado por A. Criminisi, P. Perez (Cambridge Microsoft Research Ltd.) y K. Toyama (Microsoft) [X] . Este algoritmo está dirigido a imágenes de alta información (y cuadros de video) y pretende ser el equilibrio entre la reconstrucción estructural y la reconstrucción orgánica. Los párrafos de esta respuesta contienen citas de texto completo del documento original (ya que ya no está oficialmente disponible) para hacer que esta respuesta sea más autónoma.
El algoritmo
Objetivo : reemplazar un área seleccionada ( enmascarada ) (preferiblemente un objeto de primer plano visualmente separado) con fondos visualmente plausibles.
En trabajos anteriores, varios investigadores consideraron la síntesis de texturas como una forma de llenar regiones de imágenes grandes con texturas "puras", patrones texturales repetitivos bidimensionales con estocasticidad moderada. Esto se basa en un gran cuerpo de investigación de síntesis de textura, que busca replicar la textura hasta el infinito , dada una pequeña muestra de textura pura [1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22] .
Tan efectivas como estas técnicas son para replicar texturas consistentes, tienen dificultades para llenar agujeros en fotografías de escenas del mundo real, que a menudo consisten en estructuras lineales y texturas compuestas, texturas múltiples que interactúan espacialmente [23] . El principal problema es que los límites entre las regiones de imagen son un producto complejo de influencias mutuas entre diferentes texturas. En contraste con la naturaleza bidimensional de las texturas puras, estos límites forman lo que podría considerarse estructuras de imagen más unidimensionales o lineales.
Las técnicas de pintura de imágenes llenan los agujeros en las imágenes mediante la propagación de estructuras lineales (llamadas isofotos en la literatura sobre pintura ) en la región objetivo mediante difusión. Se inspiran en las ecuaciones diferenciales parciales del flujo de calor físico y funcionan de manera convincente como algoritmos de restauración. Su inconveniente es que el proceso de difusión introduce algo de desenfoque, que es notable.
La región a rellenar, es decir, la región objetivo se indica con Ω, y su contorno se denota con δΩ. El contorno evoluciona hacia adentro a medida que avanza el algoritmo, por lo que también nos referimos a él como el "frente de relleno". La región fuente, Φ, que permanece fija en todo el algoritmo, proporciona muestras utilizadas en el proceso de llenado. Ahora nos centramos en una única iteración del algoritmo para mostrar cómo la estructura y la textura se manejan adecuadamente mediante síntesis basada en ejemplos. Suponga que la plantilla cuadrada Ψp ∈ Ω centrada en el punto p (fig. 2b) se debe llenar. La muestra de mejor coincidencia de la región de origen proviene del parche Ψqˆ ∈ Φ, que es más similar a las partes que ya están rellenadas en Ψp. En el ejemplo de la fig. 2b, vemos que si Ψp se encuentra en la continuación del borde de una imagen, las mejores coincidencias más probables se ubicarán a lo largo del mismo borde (o de un color similar) (por ejemplo, Ψq 'y Ψq' 'en la figura 2c). Todo lo que se requiere para propagar el isófoto hacia adentro es una simple transferencia del patrón desde el parche fuente de mejor coincidencia (figura 2d). Tenga en cuenta que la orientación isophote se conserva automáticamente. En la figura, a pesar de que el borde original no es ortogonal al contorno objetivo δΩ, la estructura propagada ha mantenido la misma orientación que en la región fuente.
Implementación y detalles del algoritmo
La funcionalidad de esta implementación se encapsula en una DLL COM de ActiveX que se elimina del programa host como binario y luego se invoca sobre la marcha llamando al intruso por IID. En este caso específico, la API está escrita en VisualBasic y se puede llamar desde cualquier lenguaje habilitado para COM. La siguiente sección del código elimina el binario:
La biblioteca luego se instancia usando el CLSID y el IID:
La biblioteca acepta un identificador GDIOBJECT, específicamente una sección DIB de cualquier mapa de bits GDI / + (archivos, secuencias, etc.). El archivo de imagen especificado se carga y se dibuja en un mapa de bits vacío construido a partir
Scan0
de las dimensiones de la imagen de entrada.El archivo de entrada para esta implementación es cualquier formato de archivo compatible con GDI / + que contenga datos de imagen enmascarados. La (s) máscara (s) es una o más regiones de color uniforme en la imagen de entrada. El usuario proporciona un valor de color RGB para la máscara, solo coincidirán los píxeles con exactamente ese valor de color. El color de enmascaramiento predeterminado es el verde (0, 255, 0). Todas las regiones enmascaradas juntas representan la región objetivo, Ω, que se eliminará y rellenará. La región de origen, Φ, se define como la imagen completa menos la región de destino (Φ = I − Ω).
A continuación, como con todas las síntesis de textura basadas en ejemplos [10] , se debe especificar el tamaño de la ventana de plantilla Ψ (también conocido como " radio de exploración "). Esta implementación proporciona un tamaño de ventana predeterminado de 6² píxeles, pero en la práctica requiere que el usuario establezca que sea un poco más grande que el elemento de textura distinguible más grande, o "texel", en la región de origen. Una modificación adicional al algoritmo original es el " tamaño de bloque " definible por el usuario que determina el área de píxeles que se reemplazará con un nuevo color uniforme. Esto aumenta la velocidad y disminuye la calidad. Los tamaños de bloque de más de 1px deben usarse con áreas extremadamente uniformes (agua, arena, pelaje, etc.), sin embargo, Ψ debe mantenerse al máximo. .5x el tamaño del bloque (que puede ser imposible dependiendo de la máscara).
Para no detener el algoritmo en imágenes de 1 bit, cada vez que se recibe una imagen con menos de 5 colores, el tamaño de la ventana se amplifica en 10x.
Una vez que se determinan estos parámetros, el resto del proceso de llenado de la región es completamente automático. En nuestro algoritmo, cada píxel mantiene un valor de color (o "vacío", si el píxel no está lleno) y un valor de confianza, que refleja nuestra confianza en el valor del píxel, y que se congela una vez que se ha llenado un píxel. Durante el curso del algoritmo, los parches a lo largo del frente de relleno también reciben un valor de prioridad temporal, que determina el orden en que se llenan. Luego, nuestro algoritmo itera los siguientes tres pasos hasta que se hayan completado todos los píxeles.
Paso 1: calcular las prioridades del parche
El orden de llenado es crucial para la síntesis de textura no paramétrica [1] [6] [10] [13] . Hasta ahora, el favorito predeterminado ha sido el método de "pelado de cebolla", donde la región objetivo se sintetiza desde afuera hacia adentro, en capas concéntricas. Nuestro algoritmo realiza esta tarea a través del mejor algoritmo de relleno que depende completamente de los valores de prioridad asignados a cada parche en el frente de relleno. El cálculo de prioridad está sesgado hacia aquellos parches que están en la continuación de bordes fuertes y que están rodeados por píxeles de alta confianza, estos píxeles son el límite, marcado por el valor -2. El siguiente código recalcula las prioridades:
Dado un parche Ψp centrado en el punto p para algunos p ∈ δΩ (ver figura 3), su prioridad P (p) se define como el producto de la confianza calculada (
ComputeConfidence
, o C (p) ) y el término de datos (ComputeData
, o D (p) ), donde, dónde
| Ψp | es el área de Ψp, α es un factor de normalización (p. ej., α = 255 para una imagen típica de nivel de gris), y np es un vector unitario ortogonal al frente δΩ en el punto p. La prioridad se calcula para cada parche de borde, con parches distintos para cada píxel en el límite de la región de destino.
Implementado como
El término de confianza C (p) puede considerarse como una medida de la cantidad de información confiable que rodea al píxel p. La intención es llenar primero aquellos parches que tienen más de sus píxeles ya rellenados, con preferencia adicional a los píxeles que se rellenaron desde el principio (o que nunca fueron parte de la región objetivo).
Esto incorpora automáticamente preferencia hacia ciertas formas a lo largo del frente de relleno. Por ejemplo, los parches que incluyen esquinas y zarcillos delgados de la región de destino tenderán a llenarse primero, ya que están rodeados por más píxeles de la imagen original. Estos parches proporcionan información más confiable contra la cual comparar. Por el contrario, los parches en la punta de las "penínsulas" de píxeles rellenos que sobresalen en la región de destino tenderán a dejarse de lado hasta que se llenen más de los píxeles circundantes. En un nivel aproximado, el término C (p) de (1) aproximadamente aplica el orden de relleno concéntrico deseable.
A medida que avanza el llenado, los píxeles en las capas externas de la región objetivo tenderán a caracterizarse por mayores valores de confianza y, por lo tanto, se rellenarán antes; los píxeles en el centro de la región de destino tendrán valores de confianza menores. El término de datos D (p) es una función de la fuerza de las isófotas que golpean el δΩ frontal en cada iteración. Este término aumenta la prioridad de un parche en el que un "isófoto" fluye ". Este factor es de fundamental importancia en nuestro algoritmo porque alienta a las estructuras lineales a sintetizarse primero y, por lo tanto, a propagarse de forma segura en la región objetivo. Las líneas discontinuas tienden a conectarse, dándose cuenta del "Principio de conectividad" de la psicología de la visión [7] [17] .
El orden de relleno depende de las propiedades de la imagen, lo que resulta en un proceso de síntesis orgánica que elimina el riesgo de artefactos de "estructura rota" y también reduce los artefactos en bloque sin un costoso paso de corte de parche [9] o un paso de mezcla que induce el desenfoque [19] ] .
Paso 2: Propagar información de textura y estructura
Una vez que se han calculado todas las prioridades en el frente de relleno ( límite ), se encuentra el parche Ψpˆ con la prioridad más alta. Luego lo llenamos con datos extraídos de la región fuente Φ. Propagamos la textura de la imagen mediante muestreo directo de la región de origen. Similar a [10] , buscamos en la región fuente ese parche que es más similar a Ψpˆ. Formalmente,
, dónde
La distancia d (Ψa, Ψb) entre dos parches genéricos Ψa y Ψb se define simplemente como la suma de las diferencias al cuadrado (SSD) de los píxeles ya rellenos en los dos parches. No se realiza ningún análisis o manipulación adicional ( especialmente sin desenfoque ) en este paso. Este cálculo se ejecuta en el ciclo principal y se implementa de la siguiente manera:
Obteniendo la máxima prioridad:
Encontrar el parche más similar:
Paso 3: actualizar los valores de confianza
Después de que el parche Ψpˆ se haya llenado con nuevos valores de píxeles, la confianza C (p) se actualiza en el área delimitada por Ψpˆ de la siguiente manera:
Esta simple regla de actualización nos permite medir la confianza relativa de los parches en el frente de relleno, sin parámetros específicos de la imagen. A medida que avanza el relleno, los valores de confianza disminuyen, lo que indica que estamos menos seguros de los valores de color de los píxeles cerca del centro de la región objetivo. Implementado aquí (junto con todas las demás actualizaciones necesarias):
Código completo
Aquí está el código ejecutable, completo con el código fuente de las bibliotecas como comentarios.
El código es invocado por
Se incluyen ejemplos en forma de
simplemente descomente el ejemplo que desea ejecutar con CTRL+ Q.
Archivos de prueba oficiales
Este algoritmo está hecho para ajustarse para cada imagen. Por lo tanto, los valores predeterminados (y también las máscaras predeterminadas) son completamente subóptimos. Los valores predeterminados se eligen para que cada muestra se pueda procesar en un período de tiempo razonable. Recomiendo jugar con máscaras de formas irregulares y mejores tamaños de ventana. Haga clic en las imágenes para ampliar!
Tablero de damas
→
gótico americano
→
Laberinto
→
Mona Lisa
→
(máscara terrible)
Gritar
→
Estrellado
→
Ejemplos del mundo real
Todos estos usan máscaras personalizadas dibujadas a mano.
Si tiene otras imágenes interesantes que le gustaría ver incluidas, deje un comentario.
Mejoras EBII
Existen múltiples variantes de EBII, creadas por varios investigadores. AnkurKumar Patel me llamó la atención con su colección de documentos [24] sobre varias mejoras de EBII.
Específicamente, el documento " Algoritmo robusto mejorado para la incrustación de imágenes basadas en ejemplos " [25] menciona dos mejoras en la ponderación de los valores de prioridad.
El mejoramiento
La modificación efectiva se encuentra en el Paso 1 (ver arriba) del algoritmo, y extiende el efecto C (p) y D (p) en la clasificación de prioridad para este píxel usando esto:
En la fórmula para C y D dada anteriormente, y son respectivamente el factor de normalización (p. Ej., Α = 255), el vector isófoto y el vector unitario ortogonal al frente en el punto p.
Promover, adicional,
La función de prioridad se define como la suma ponderada del término de confianza regularizado C (p) y el nuevo término de datos D (p) . Donde α es el coeficiente de ajuste, la satisfacción de 0Rp (p) se define a continuación:
Donde α y β son respectivamente los pesos componentes de la confianza y los términos de datos. Tenga en cuenta que α + β = 1 .
Puntuación objetiva
Sin embargo, lo que es realmente interesante es que este documento contiene un método propuesto (¡y simple!) Para calificar el rendimiento de los algoritmos EBII. Sin embargo, tome esto con un grano de sal, ya que este es un método elegido por los propios autores del artículo para verificar la efectividad del enfoque de variación propuesto y la mejora en varias imágenes.
La evaluación del resultado se realiza comparando el PSNR (la relación señal / ruido de pico [26] ) entre la imagen restaurada y la imagen original. Generalmente, cuanto mayor es el valor de PSNR, mayor es la similitud de la imagen reparada con el original. La ecuación para calcular el PSNR es la siguiente:
Estas son las asombrosas 2 (¡dos!) Imágenes de prueba del mundo real que utilizaron:
La conclusión es tan decepcionante como la calidad del papel en sí. Muestra muy poca mejora. Lo principal aquí es un posible método de puntuación de objetos para este tipo de desafío (y otros desafíos de reparación de imágenes):
Meh
Investigación por hacer
(Específico para EBII)
a) Preprocesamiento
Todo se reduce al principio de "Borrado mágico" de que el algoritmo debería "simplemente funcionar" para todo. Mi solución ingenua para esto es una amplificación basada en el color (ver arriba), pero hay mejores formas. Estoy pensando en reconocer la media geométrica de todos los texels trazables para ajustar automáticamente el tamaño de la ventana y hacer que el tamaño del sello (también mi mejora) dependa de la resolución de texel e imagen completa. La investigación tiene que hacerse aquí.
b) Postprocesamiento
Los autores originales ya hicieron un gran trabajo al desacreditar todos los filtros de procesamiento posterior que vienen en mente. Hoy, probé algo más, inspirado en la siempre extraña Mona Lisa (gracias metro subterráneo). Si toma solo la región pintada y aplica una nueva máscara a todos los bloques extraños de color y la introduce en un algoritmo de eliminación de errores, tendrá un resultado casi perfecto. Puedo explorar esto en algún momento en el futuro.
[X] - Eliminación de objetos por pintura basada en ejemplos por A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Sintetizando texturas naturales. En proc. ACM Symp. on Interactive 3D Graphics, págs. 217–226, Research Triangle Park, Carolina del Norte, marzo de 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro y S. Osher. Estructura simultánea e imagen de textura en pintura. a aparecer, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli y JH. Chenot Falta la corrección de datos en imágenes fijas y secuencias de imágenes. En ACM Multimedia, Francia, diciembre de 2002.
[7] - TF Chan y J. Shen. Pintura sin textura mediante difusiones conducidas por curvatura (CDD). J. Visual Comm. Representante de imagen, 4 (12), 2001.
[8] - JS de Bonet. Procedimiento de muestreo multirresolución para análisis y síntesis de imágenes de textura. En proc. ACM Conf. Comp. Gráficos (SIGGRAPH), volumen 31, págs. 361–368, 1997.
[9] - A. Efros y WT Freeman. Acolchado de imagen para síntesis y transferencia de textura. En proc. ACM Conf. Comp. Gráficos (SIGGRAPH), págs. 341–346, Eugene Fiume, agosto de 2001.
[10] - A. Efros y T. Leung. Síntesis de textura por muestreo no paramétrico. En proc. ICCV, págs. 1033–1038, Kerkyra, Grecia, septiembre de 1999.
[11] - WT Freeman, EC Pasztor y OT Carmichael. Aprendizaje de visión de bajo nivel. En t. J. Computer Vision, 40 (1): 25–47, 2000.
[12] - D. Garber. Modelos computacionales para análisis de textura y síntesis de textura. Tesis doctoral, Univ. del sur de California, Estados Unidos, 1981.
[13] - P. Harrison. Un procedimiento no jerárquico para la resíntesis de textura compleja. En proc. En t. Conf. Europa Central Comp. Gráficos, Visua. y Comp. Vision, Plzen, República Checa, febrero de 2001.
[14] - DJ Heeger y JR Bergen. Análisis / síntesis de textura basada en pirámides. En proc. ACM Conf. Comp. Gráficos (SIGGRAPH), volumen 29, págs. 229–233, Los Ángeles, CA, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless y D. Salesin. Analogías de imagen. En proc. ACM Conf. Comp. Gráficos (SIGGRAPH), Eugene Fiume, agosto de 2001.
[16] - H. Igehy y L. Pereira. Reemplazo de imagen mediante síntesis de textura. En proc. En t. Conf. Procesamiento de imágenes, págs. III: 186–190, 1997.
[17] - G. Kanizsa. Organización en visión. Praeger, Nueva York, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo y H.-Y. Shum Síntesis de textura en tiempo real mediante muestreo basado en parches. En ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey y M. Levoy. Síntesis de textura rápida usando cuantificación vectorial estructurada en árbol. En proc. ACM Conf. Comp. Gráficos (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen y L. van Gool. Síntesis de textura compuesta paralela. En el taller Texture 2002 - (en conjunto con ECCV02), Copenhague, Dinamarca, junio de 2002.
[24] - AkurKumar Patel, Universidad Tecnológica de Gujarat, Ciencias de la Computación e Ingeniería
[25] - Algoritmo robusto mejorado para la impresión de imágenes basadas en ejemplos
[26] - Wikipedia, relación señal-ruido-pico
fuente
Matlab
Este es un enfoque de interpolación simple. La idea es primero reflejar lo que está a cada lado del parche. Luego, esos píxeles de imagen especular se interpolan por lo cerca que están del borde correspondiente:
La parte difícil fue encontrar una buena interpolación de pesos. Después de jugar un poco, se me ocurrió una función racional que es cero en todos los bordes, excepto en el que nos reflejamos. Esto se transforma luego en un polinomio de tercer grado para un poco de suavizado:
Este enfoque simple funciona sorprendentemente bien en imágenes "naturales", pero tan pronto como te enfrentas a bordes afilados, el juego termina. En el ejemplo gótico americano, los picos del tenedor de heno se alinean muy bien con la cuadrícula de píxeles, lo que lo hace ver bastante bien, pero de lo contrario hubiera sido mucho peor.
Así que aquí los resultados:
Y finalmente, el código:
fuente
Mathematica
Esto usa la
Inpaint
función de Mathematica . Debido a que Mathematica hace todo el trabajo pesado, este es un wiki comunitario.inPaint
(abajo) es una simple adaptación deInpaint
. Para pinturas / fotos en color, utiliza el ajuste predeterminado "TextureSynthesis". Si detecta que la imagen es en blanco y negro (debido a que los datos de la imagen son los mismos que los de la forma binaria de la imagen), binariza la imagen y aplica el parche "TotalVariation". LaIf
cláusula sea aplicableBinarize
oIdentity
la fotografía. (LaIdentity
función devuelve su argumento sin cambios).La imagen y la máscara se ingresan como argumentos para
inPaint
.Partition
yGrid
son meramente para fines de formateo.Las salidas han sido parcheadas. No hubo retoque de las imágenes después
inPaint
.fuente
Inpaint
parece buscar simetrías en toda la imagen en blanco y negro. - DavidC hace 9 horasPython 2 y PIL
Este programa combina copias de las regiones Norte, Sur, Este y Oeste para crear píxeles de reemplazo que usan colores, texturas y sombras de la región de la imagen local.
Las salidas de ejemplo:
El código primero encuentra el cuadro delimitador para el parche. Luego, para que se genere cada píxel, calcula el color de cada canal (RGB) en función de la suma ponderada de las 4 regiones circundantes.
fuente
Python 3, PIL
Este programa utiliza el operador sobel y dibuja líneas en la imagen en función de eso.
El operador de sobel encuentra el ángulo de cada borde, por lo que cualquier borde que se extrusione en el área desconocida debe continuar.
Mientras tanto, aquí están las imágenes de muestra.
Mona Lisa Mona Lisa Ḿ͠oǹ̰͎̣a ̾̇Lisa Ḿ͠o̢̎̓̀ǹ̰͎̣aͧ̈ͤ ̣̖̠̮̘̹̠̾̇ͣLisa Ḿ̳̜͇͓͠o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ ̣̖̠̮̘̹̠̾̇ͣL͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
El área en la imagen de arriba es tan suave como un cactus
No es muy bueno con color constante.
fuente
Python 2
Script simple de Python que crea parches utilizando valores de píxeles justo fuera del espacio. Toma valores de color desde el final de la fila y la columna de los píxeles y calcula el promedio ponderado usando la distancia desde esos píxeles.
La salida no es tan bonita, pero es arte .
Y luego, código:
fuente
Mathematica
Sucede que Mathematica tiene una función incorporada que realiza exactamente esta tarea, y quiero decir exactamente :
De forma predeterminada, utiliza un "método de síntesis de textura que mejor se ajusta mediante muestreo aleatorio" que produce buenos resultados en las pinturas, pero malos resultados para el laberinto y el tablero de ajedrez:
Jugar con la configuración no me proporcionó un aumento de la calidad en todas las imágenes, por lo que solo utilicé los valores predeterminados (para guardar bytes, ¡esto es
codegolf.se
después de todo!).fuente
Binarize
(para eliminar manchas grises). Pruebe esto:methods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
TextureSynthesis
ve bien en las pinturas; y no creo que se nos permita ajustar nuestra configuración para cada caso de prueba individual. (Si pudiéramos, entonces podríamos suministrar trivialmente la porción faltante como una 'configuración'.)inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
Python3
Esta respuesta implementa la idea en el documento "Deep Image Prior" de Ulyanov et al. (CVPR 2018) En este documento exploraron la idea de que la forma en que se diseñan las redes neuronales para el procesamiento de imágenes refleja de cerca nuestra idea de cómo debería ser una imagen natural (la distribución "previa").
Propusieron un método que se puede usar para pintar, así como para eliminar el ruido y los artefactos, que solo usa la imagen dada sin capacitación sobre ningún otro dato. El concepto real es bastante simple: la red está entrenada para emitir la imagen deseada (para algo de ruido aleatorio fijo como entrada) penalizando solo los errores fuera de alguna máscara dada. Si desea eliminar el ruido, simplemente no necesita enmascarar nada, solo deténgase temprano en el entrenamiento.
Para la pintura, enmascara la parte que desea pintar y entrena hasta la convergencia. Ciertamente no es lo último en tecnología, pero todavía quería publicarlo, probarlo y publicarlo aquí debido a la simplicidad de la idea y al rendimiento aún notable. En mis experimentos, la pintura de parches más grandes no resultó tan bien, pero para segmentos más pequeños los resultados pueden ser mucho más convincentes.
Implementé esto usando la popular arquitectura U-Net de jaxony en github . El código para entrenar y procesar las imágenes se puede encontrar a continuación.
Formación
Esta es una visualización del proceso de capacitación. Cada cuadro es el estado de un cierto número de iteraciones:
Ejemplos
Código
Tenga en cuenta que en una CPU esto puede tardar horas en ejecutarse para una sola imagen, mientras que una buena GPU habilitada para Cuda puede tomar mucho menos tiempo.
fuente
Python con OpenCV
OpenCV tiene una función llamada inpaint. Se usan dos tipos de pintura, usaré el Método de Marcha Rápida. Según la documentación, el algoritmo funciona así:
Aquí está el código *:
Tenga en cuenta cómo convierto el BGR a RGB por motivos de trazado. Además, lo giro. Aquí están los resultados:
Mona Lisa regresa!
Como puede ver, no soy el mejor con los dos colores.
fuente
Java
Un enfoque de promedio de color. Probablemente se puede mejorar.
Resultados:
fuente