Em um software popular de edição de imagens, há um recurso, que os patches (o termo usado no processamento de imagens é pintado como @ mınxomaτ apontado.) Em uma área selecionada de uma imagem, com base nas informações externas desse patch. E faz um bom trabalho, considerando que é apenas um programa. Como humano, às vezes você pode ver que algo está errado, mas se você apertar os olhos ou apenas dar uma rápida olhada, o adesivo parece preencher a lacuna muito bem.
Desafio
Dada uma imagem e uma máscara que especifica uma área retangular da imagem devem ser corrigidas (também como imagem ou qualquer outro formato preferido), seu programa deve tentar preencher a área especificada com um patch que tente se misturar com o restante da imagem. a imagem. O programa não pode usar as informações da imagem original que estavam dentro da área especificada.
Você pode supor que o patch esteja sempre a pelo menos a largura dos lados e a altura da parte superior e inferior da imagem. Isso significa que a área máxima de um patch é 1/9 da imagem inteira.
Por favor, adicione uma breve descrição de como seu algoritmo funciona.
Votando
Pede-se aos eleitores que julguem o desempenho dos algoritmos e votem de acordo.
Algumas sugestões sobre como julgar: (Mais uma vez, obrigado @ mınxomaτ pelos mais alguns critérios.)
- Se você apertar os olhos e a imagem parecer boa?
- Você pode dizer exatamente onde está o patch?
- Até que ponto as estruturas e texturas do fundo da imagem e da área circundante continuam?
- Quantos pixels dispersos de cores falsas a área editada contém?
- Existem blobs / blocos de cores uniformes na área que parecem não pertencer a isso?
- A área editada possui mudanças drásticas de cor / contraste ou brilho em comparação com o restante da imagem?
Critério de validade
Para que um envio seja válido, a imagem de saída deve corresponder exatamente à imagem de entrada fora da área especificada.
Caso de teste
À esquerda, a imagem de origem, à direita, a máscara correspondente:
inpaint.exe left top width height img.jpg
)?Respostas:
AutoIt , VB
Introdução
Esta é uma implementação do algoritmo Remoção de Objetos por Inpainting Baseada em Exemplos desenvolvido por A. Criminisi, P. Perez (Cambridge Microsoft Research Ltd.) e K. Toyama (Microsoft) [X] . Esse algoritmo é direcionado a imagens de alta informação (e quadros de vídeo) e visa ser o equilíbrio entre reconstrução estrutural e reconstrução orgânica. Os parágrafos desta resposta contêm citações de texto completo do artigo original (uma vez que não está mais disponível oficialmente) para tornar essa resposta mais independente.
O Algoritmo
Objetivo : Substituir uma área selecionada ( mascarada ) (de preferência um objeto em primeiro plano visualmente separado) por fundos visualmente plausíveis.
Em trabalhos anteriores, vários pesquisadores consideraram a síntese de textura como uma maneira de preencher grandes regiões de imagem com texturas "puras" - padrões repetitivos de textura bidimensional com estocástica moderada. Isso se baseia em um amplo corpo de pesquisa de síntese de textura, que busca replicar a textura ad infinitum , dada uma pequena amostra de fonte de textura pura [1] [8] [9] [10] [11] [12] [14] [15] [16] [19] [22] .
Por mais eficazes que sejam essas técnicas na replicação de textura consistente, elas têm dificuldade em preencher buracos nas fotografias de cenas do mundo real, que geralmente consistem em estruturas lineares e texturas compostas - várias texturas interagindo espacialmente [23] . O principal problema é que os limites entre as regiões da imagem são um produto complexo de influências mútuas entre diferentes texturas. Em contraste com a natureza bidimensional das texturas puras, esses limites formam o que pode ser considerado mais estruturas de imagem unidimensionais ou lineares.
Imagem inpainting técnicas encher furos em imagens por propagação de estruturas lineares (chamados isofotas na inpainting literatura) para a região alvo através de difusão. Eles são inspirados pelas equações diferenciais parciais do fluxo de calor físico e funcionam de maneira convincente como algoritmos de restauração. Sua desvantagem é que o processo de difusão introduz um pouco de desfoque, o que é perceptível.
A região a ser preenchida, ou seja, a região alvo é indicada por Ω e seu contorno é denotado δΩ. O contorno evolui para dentro à medida que o algoritmo progride, e também o chamamos de "frente de preenchimento". A região de origem, Φ, que permanece fixa em todo o algoritmo, fornece amostras usadas no processo de preenchimento. Agora, focamos em uma única iteração do algoritmo para mostrar como a estrutura e a textura são tratadas adequadamente por síntese baseada em exemplos. Suponha que o modelo quadrado Ψp ∈ Ω centrado no ponto p (fig. 2b) seja preenchido. A amostra de melhor correspondência da região de origem vem do patch Ψqˆ ∈ Φ, que é mais semelhante às partes que já foram preenchidas Ψp. No exemplo da fig. 2b, vemos que se liesp está na continuação de uma borda da imagem, as melhores correspondências provavelmente ocorrerão na mesma borda (ou de uma cor similar) (por exemplo, Ψq 'e Ψq' 'na figura 2c). Tudo o que é necessário para propagar a isofote para dentro é uma simples transferência do padrão do patch de melhor correspondência de origem (fig. 2d). Observe que a orientação isophote é preservada automaticamente. Na figura, apesar de a aresta original não ser ortogonal ao contorno alvo δΩ, a estrutura propagada manteve a mesma orientação da região de origem.
Detalhes de implementação e algoritmo
A funcionalidade desta implementação é encapsulada em uma DLL COM do ActiveX, que é descartada do programa host como um binário e, em seguida, invocada rapidamente, chamando o inpainter pelo IID. Nesse caso específico, a API é escrita em VisualBasic e pode ser chamada de qualquer idioma habilitado para COM. A seção a seguir do código descarta o binário:
A biblioteca é instanciada posteriormente usando o CLSID e o IID:
A biblioteca aceita um identificador GDIOBJECT, especificamente uma DIBSection de qualquer bitmap GDI / + (arquivos, fluxos etc.). O arquivo de imagem especificado é carregado e desenhado em um bitmap vazio construído a partir
Scan0
das dimensões da imagem de entrada.O arquivo de entrada para esta implementação é qualquer formato de arquivo compatível com GDI / + que contém dados de imagem mascarada. As máscaras são uma ou mais regiões uniformemente coloridas na imagem de entrada. O usuário fornece um valor de cor RGB para a máscara, apenas pixels com exatamente esse valor de cor serão correspondidos. A cor de máscara padrão é verde (0, 255, 0). Todas as regiões mascaradas juntas representam a região de destino, Ω, a ser removida e preenchida. A região de origem, is, é definida como a imagem inteira menos a região de destino (Φ = I-Ω).
Em seguida, como em toda síntese de textura baseada em exemplos [10] , o tamanho da janela do modelo Ψ (também conhecido como " raio de varredura ") deve ser especificado. Essa implementação fornece um tamanho de janela padrão de 6² pixels, mas, na prática, exige que o usuário defina um pouco maior que o maior elemento de textura distinguível, ou "texel", na região de origem. Uma modificação adicional no algoritmo original é o " tamanho do bloco " definível pelo usuário, que determina a área de pixels a serem substituídos por uma nova cor uniforme. Isso aumenta a velocidade e diminui a qualidade. Os tamanhos de bloco maiores que 1px devem ser usados em áreas extremamente uniformes (água, areia, pele etc.), no entanto, Ψ deve ser mantido no máximo. .5x o tamanho do bloco (que pode ser impossível dependendo da máscara).
Para não travar o algoritmo em imagens de 1 bits, toda vez que uma imagem com menos de 5 cores é recebida, o tamanho da janela é amplificado em 10x.
Uma vez determinados esses parâmetros, o restante do processo de preenchimento da região é completamente automático. Em nosso algoritmo, cada pixel mantém um valor de cor (ou "vazio", se o pixel não estiver preenchido) e um valor de confiança, que reflete nossa confiança no valor do pixel e é congelado quando o pixel é preenchido. Durante o curso do algoritmo, os patches ao longo da frente de preenchimento também recebem um valor de prioridade temporário, que determina a ordem em que eles são preenchidos. Em seguida, nosso algoritmo itera as três etapas a seguir até que todos os pixels tenham sido preenchidos.
Etapa 1: Computando as prioridades do patch
A ordem de preenchimento é crucial para a síntese não-paramétrica de texturas [1] [6] [10] [13] . Até agora, o favorito padrão tem sido o método "casca de cebola", onde a região de destino é sintetizada de fora para dentro, em camadas concêntricas. Nosso algoritmo executa essa tarefa por meio do melhor algoritmo de preenchimento que depende inteiramente dos valores de prioridade atribuídos a cada amostra na frente de preenchimento. O cálculo da prioridade é enviesado em direção àquelas amostras que estão na continuação de arestas fortes e cercadas por pixels de alta confiança; esses pixels são o limite, marcado pelo valor -2. O código a seguir recalcula as prioridades:
Dado um patch Ψp centrado no ponto p para alguns p ∈ δΩ (ver fig. 3), sua prioridade P (p) é definida como o produto da confiança calculada (
ComputeConfidence
ou C (p) ) e o termo de dados (ComputeData
, ou D (p) ), onde, Onde
| Ψp | é a área de Ψp, α é um fator de normalização (por exemplo, α = 255 para uma imagem típica de nível de cinza) e np é um vetor unitário ortogonal à frente δΩ no ponto p. A prioridade é calculada para cada patch de borda, com patches distintos para cada pixel no limite da região de destino.
Implementado como
O termo de confiança C (p) pode ser pensado como uma medida da quantidade de informações confiáveis em torno do pixel p. A intenção é preencher primeiro os patches que já tenham mais pixels preenchidos, com preferência adicional aos pixels que foram preenchidos desde o início (ou que nunca fizeram parte da região de destino).
Isso incorpora automaticamente a preferência para determinadas formas ao longo da frente de preenchimento. Por exemplo, os patches que incluem cantos e gavinhas finas da região de destino tendem a ser preenchidos primeiro, pois são cercados por mais pixels da imagem original. Esses patches fornecem informações mais confiáveis com as quais comparar. Por outro lado, as manchas na ponta das “penínsulas” de pixels preenchidos que se projetam na região de destino tendem a ser deixadas de lado até que mais pixels adjacentes sejam preenchidos. Em um nível aproximado, o termo C (p) de (1) aproximadamente impõe a ordem de preenchimento concêntrico desejável.
À medida que o preenchimento prossegue, os pixels nas camadas externas da região de destino tendem a ser caracterizados por maiores valores de confiança e, portanto, são preenchidos mais cedo; pixels no centro da região de destino terão valores de confiança menores. O termo de dados D (p) é uma função da força das isofotes atingindo a frente δΩ a cada iteração. Esse termo aumenta a prioridade de um patch para o qual uma isofote "flui". Esse fator é de fundamental importância em nosso algoritmo, pois estimula estruturas lineares a serem sintetizadas primeiro e, portanto, propagadas com segurança na região de destino. Linhas quebradas tendem a se conectar, realizando o "Princípio da Conectividade" da psicologia da visão [7] [17] .
A ordem de preenchimento depende das propriedades da imagem, resultando em um processo de síntese orgânica que elimina o risco de artefatos de “estrutura quebrada” e também reduz artefatos em blocos sem uma etapa cara de corte de adesivo [9] ou uma etapa de mistura indutora de desfoque [19 ] .
Etapa 2: Propagando informações de textura e estrutura
Depois de calculadas todas as prioridades na frente de preenchimento ( limite ), o patch Ψpˆ com maior prioridade é encontrado. Em seguida, preenchemos com dados extraídos da região de origem Φ. Propagamos a textura da imagem por amostragem direta da região de origem. Semelhante a [10] , procuramos na região de origem o patch mais semelhante ao topˆ. Formalmente,
, Onde
a distância d (Ψa, Ψb) entre dois patches genéricos anda e Ψb é simplesmente definida como a soma das diferenças quadráticas (SSD) dos pixels já preenchidos nos dois patches. Nenhuma análise ou manipulação adicional ( especialmente sem desfoque ) é feita nesta etapa. Este cálculo é executado no ciclo principal do ciclo e é implementado da seguinte maneira:
Obtendo a prioridade máxima:
Encontrando o patch mais semelhante:
Etapa 3: Atualizando Valores de Confiança
Após o patch Ψpˆ ter sido preenchido com novos valores de pixel, a confiança C (p) é atualizada na área delimitada por ˆpˆ da seguinte maneira:
Essa regra de atualização simples permite medir a confiança relativa dos patches na frente de preenchimento, sem parâmetros específicos da imagem. À medida que o preenchimento prossegue, os valores de confiança diminuem, indicando que temos menos certeza dos valores de cores dos pixels próximos ao centro da região de destino. Implementado aqui (junto com todas as outras atualizações necessárias):
Código completo
Aqui está o código executável, completo com o código fonte das bibliotecas como comentários.
O código é chamado por
Exemplos são incluídos na forma de
apenas remova o comentário do exemplo que você deseja executar usando CTRL+ Q.
Arquivos oficiais de teste
Este algoritmo é feito para ser ajustado para cada imagem. Portanto, os valores padrão (e também as máscaras padrão) são completamente abaixo do ideal. Os valores padrão são escolhidos para que cada amostra possa ser processada em um período de tempo razoável. Eu recomendo jogar com máscaras de forma irregular e melhores tamanhos de janelas. Clique nas imagens para aumentá-las!
Tabuleiro de damas
→
gótico americano
→
Labirinto
→
Monalisa
→
(máscara terrível)
Grito
→
Estrelado
→
Exemplos do mundo real
Todos eles usam máscaras personalizadas desenhadas à mão.
Se você tiver outras imagens interessantes que gostaria de ver incluídas, deixe um comentário.
Melhorias no EBII
Existem várias variantes do EBII por aí, criadas por vários pesquisadores. AnkurKumar Patel chamou minha atenção com sua coleção de artigos [24] sobre várias melhorias no EBII.
Especificamente, o artigo " Algoritmo Robusto Aprimorado para Pintura de Imagem Baseada em Exemplos " [25] menciona duas melhorias na pesagem dos valores de prioridade.
A melhoria
A modificação efetiva está na Etapa 1 (veja acima) do algoritmo e estende o efeito C (p) e D (p) na classificação de prioridade para esse pixel usando o seguinte:
Na fórmula para C e D dada acima, e são respectivamente o fator de normalização (por exemplo, α = 255), o vetor isofoto e o vetor unitário ortogonal à frente no ponto p.
Mais distante,
A função de prioridade é definida como a soma de peso do termo de confiança regularizado C (p) e o novo termo de dados D (p) . Onde α é o coeficiente de ajuste, é definido o seguinte 0Rp (p):
Onde α e β são respectivamente os pesos dos componentes da confiança e os termos dos dados. Note que α + β = 1 .
Pontuação objetiva
O que é realmente interessante é que este artigo contém um método proposto (e simples!) Para pontuar o desempenho se houver algoritmos EBII. Leve isso com um pouco de sal, pois esse é um método escolhido pelos próprios autores do artigo para verificar a eficácia da abordagem de variância proposta e a melhoria em várias imagens.
A avaliação do resultado é realizada através da comparação do PSNR (relação sinal de pico / ruído [26] ) entre a imagem restaurada e a imagem original. Geralmente, quanto maior o valor do PSNR, maior a semelhança da imagem reparada com a original. A equação para calcular o PSNR é a seguinte:
Estas são as impressionantes 2 (duas!) Imagens de teste do mundo real que eles usaram:
A conclusão é tão decepcionante quanto a qualidade do papel em si. Isso mostra muito pouca melhoria. O principal aqui é um possível método de pontuação de objetos para esse tipo de desafio (e outros desafios de reparo de imagem):
Meh.
Pesquisa a ser realizada
(Específico para EBII)
a) Pré-processamento
Tudo se resume ao princípio "Apagamento mágico" de que o algoritmo deve "apenas funcionar" para tudo. Minha solução ingênua para isso é uma amplificação baseada em cores (veja acima), mas existem maneiras melhores. Estou pensando em reconhecer a média geométrica de todos os texels rastreáveis para ajustar automaticamente o tamanho da janela e tornar o tamanho do carimbo (também minha melhoria) dependente da resolução de texel e de imagem inteira. A pesquisa tem que ser feita aqui.
b) Pós-processamento
Os autores originais já fizeram um ótimo trabalho ao desmembrar todos os filtros de pós-processamento que vêm à mente. Hoje, tentei outra coisa, inspirada na sempre misteriosa Mona Lisa (graças ao undergroundmonorail). Se você pegar apenas a região não pintada e aplicar uma nova máscara a todos os estranhos blocos de cores e inseri-los em um algoritmo de despeckling, ficará com um resultado quase perfeito. Eu posso explorar isso em algum momento no futuro.
[X] - Remoção de Objetos por Pintura com Base em Exemplos por A. Criminisi, P. Perez, K. Toyama
[1] - M. Ashikhmin. Sintetizando texturas naturais. Em Proc. ACM Symp. em Interactive 3D Graphics, pp. 217–226, Research Triangle Park, NC, março de 2001.
[5] - M. Bertalmio, L. Vese, G. Sapiro e S. Osher. Pintura simultânea de estrutura e imagem de textura. para aparecer, 2002
[6] - R. Bornard, E. Lecan, L. Laborelli e JH. Chenot. Correção de dados ausentes em imagens estáticas e seqüências de imagens. Em ACM Multimedia, França, dezembro de 2002.
[7] - TF Chan e J. Shen. Pintura sem textura por difusões orientadas por curvatura (CDD). J. Visual Comm. Representante da Imagem, 4 (12), 2001.
[8] - JS de Bonet. Procedimento de amostragem multirresolução para análise e síntese de imagens de textura. Em Proc. ACM Conf. Comp. Graphics (SIGGRAPH), volume 31, pp. 361–368, 1997.
[9] - A. Efros e WT Freeman. Acolchoado de imagens para síntese e transferência de texturas. Em Proc. ACM Conf. Comp. Graphics (SIGGRAPH), pp. 341-346, Eugene Fiume, agosto de 2001.
[10] - A. Efros e T. Leung. Síntese de textura por amostragem não paramétrica. Em Proc. ICCV, pp. 1033-1038, Kerkyra, Grécia, setembro de 1999.
[11] - WT Freeman, EC Pasztor e OT Carmichael. Aprendendo visão de baixo nível. Int. J. Computer Vision, 40 (1): 25-47, 2000.
[12] - D. Garber. Modelos computacionais para análise e síntese de texturas. Tese de doutorado, Univ. do sul da Califórnia, EUA, 1981.
[13] - P. Harrison. Um procedimento não hierárquico para re-síntese de textura complexa. Em Proc. Int. Conf. Europa Central Comp. Gráficos, Visua. e Comp. Vision, Plzen, República Tcheca, fevereiro de 2001.
[14] - DJ Heeger e JR Bergen. Análise / síntese de textura baseada em pirâmide. Em Proc. ACM Conf. Comp. Graphics (SIGGRAPH), volume 29, pp. 229-233, Los Angeles, CA, 1995.
[15] - A. Hertzmann, C. Jacobs, N. Oliver, B. Curless e D. Salesin. Analogias de imagem. Em Proc. ACM Conf. Comp. Graphics (SIGGRAPH), Eugene Fiume, agosto de 2001.
[16] - H. Igehy e L. Pereira. Substituição de imagem através da síntese de textura. Em Proc. Int. Conf. Image Processing, pp. III: 186–190, 1997.
[17] - G. Kanizsa. Organização em visão. Praeger, Nova Iorque, 1979.
[19] - L. Liang, C. Liu, Y.-Q. Xu, B. Guo e H.-Y. Shum. Síntese de textura em tempo real por amostragem baseada em patch. Em ACM Transactions on Graphics, 2001.
[22] - L.-W. Wey e M. Levoy. Síntese rápida de textura usando quantização vetorial estruturada em árvore. Em Proc. ACM Conf. Comp. Graphics (SIGGRAPH), 2000.
[23] - A. Zalesny, V. Ferrari, G. Caenen e L. van Gool. Síntese de textura composta paralela. Oficina In Texture 2002 - (em conjunto com ECCV02), Copenhague, Dinamarca, junho de 2002.
[24] - AkurKumar Patel, Universidade Tecnológica de Gujarat, Ciência da Computação e Engenharia
[25] - Algoritmo Robusto Aprimorado para Pintura de Imagem Baseada em Exemplos
[26] - Wikipedia, Relação Pico-Sinal-Ruído
fonte
Matlab
Essa é uma abordagem simples de interpolação. A idéia é espelhar primeiro o que está em cada lado do patch. Em seguida, esses pixels da imagem espelhada são interpolados pela proximidade com a borda correspondente:
A parte complicada foi encontrar um bom peso de interpolação. Depois de algumas brincadeiras, criei uma função racional que é zero em todas as extremidades, exceto aquela em que espelhamos. Isso é transformado por um polinômio de terceiro grau para uma certa suavização:
Essa abordagem simples funciona surpreendentemente bem em imagens "naturais", mas assim que você se depara com arestas vivas, o jogo acaba. No exemplo gótico americano, os picos do garfo de feno alinham-se muito bem com a grade de pixels, o que faz com que pareça bastante agradável, mas teria sido muito pior caso contrário.
Então aqui estão os resultados:
E, finalmente, o código:
fonte
Mathematica
Isso usa a
Inpaint
função do Mathematica . Como o próprio Mathematica faz todo o trabalho pesado, este é um wiki da comunidade.inPaint
(abaixo) é uma adaptação simples deInpaint
. Para pinturas / fotos coloridas, ele usa a configuração padrão "TextureSynthesis". Se detectar que a imagem está em preto e branco (porque os dados da imagem são os mesmos da imagem binária da imagem), ela binariza a imagem e aplica o patch "TotalVariation". AIf
cláusula se aplicaBinarize
ouIdentity
à imagem. (AIdentity
função retorna seu argumento inalterado.)A imagem e a máscara são inseridas como argumentos para
inPaint
.Partition
eGrid
são apenas para fins de formatação.As saídas foram corrigidas. Não houve retoque das imagens depois
inPaint
.fonte
Inpaint
parece procurar simetrias em toda a imagem em preto e branco. - DavidC 9 hours agoPython 2 e PIL
Este programa combina cópias das regiões Norte, Sul, Leste e Oeste para criar pixels de substituição que usam cores, texturas e sombras da região da imagem local.
O exemplo gera:
O código encontra primeiro a caixa delimitadora do patch. Em seguida, para cada pixel a ser gerado, ele calcula a cor de cada canal (RGB) com base na soma ponderada das 4 regiões circundantes.
fonte
Python 3, PIL
Este programa usa o operador sobel e desenha linhas na imagem com base nisso.
O operador sobel encontra o ângulo de cada aresta; portanto, todas as arestas que extrudam para a área desconhecida devem continuar.
Enquanto isso, aqui estão as imagens de amostra.
Mona Lisa Mona Lisa Ḿ͠oǹ̰͎̣a ̾̇Lisa Ḿ͠o̢̎̓̀ǹ̰͎̣aͧ̈ͤ ̣̖̠̮̘̹̠̾̇ͣLisa Ḿ̳̜͇͓͠o̢̎̓̀ǹ̰͎̣͙a̤̩̖̞̝ͧ̈ͤͤ ̣̖̠̮̘̹̠̾̇ͣL͉̻̭͌i̛̥͕̱͋͌ş̠͔̏̋̀ạ̫͕͎ͨͮͪ̐͡ͅ
A área na imagem acima é tão lisa quanto um cacto
Não é muito bom com cores constantes.
fonte
Python 2
Script python simples que cria um patch usando valores de pixels apenas fora da lacuna. Ele pega os valores de cores do final da linha e coluna dos pixels e calcula a média ponderada usando a distância desses pixels.
A produção não é tão bonita, mas é arte .
E então, codifique:
fonte
Mathematica
Acontece que o Mathematica tem uma função interna que executa exatamente essa tarefa, e eu quero dizer exatamente :
Por padrão, ele usa um "método de síntese de textura mais adequado usando amostragem aleatória", que produz bons resultados nas pinturas, mas maus resultados para o labirinto e o tabuleiro de damas:
Brincar com as configurações não me proporcionou um aumento na qualidade em todas as imagens, então eu apenas usei os padrões (para salvar bytes -
codegolf.se
afinal de contas!).fonte
Binarize
(para eliminar manchas cinzentas). Tente isto:methods = {"TextureSynthesis", "Diffusion", "FastMarching", "NavierStokes", "TotalVariation"};g[pic_, mask_] := Join[{Labeled[Framed@pic, "Original"]}, Labeled[ Binarize@Inpaint[pic, mask, Method -> #], #] & /@ methods]
TextureSynthesis
fica bem nas pinturas; e acho que não podemos ajustar nossas configurações para cada caso de teste individual. (Se pudéssemos, então poderíamos trivialmente suprir a parte ausente como um 'ajuste'.)inPaint[picture_, mask_] := If[bw = ImageData@Rasterize[Binarize[picture]] == ImageData[picture], Binarize, Identity]@ Inpaint[picture, mask, Method -> If[bw, "TotalVariation", "TextureSynthesis"]]
Python3
Esta resposta implementa a idéia no artigo "Deep Image Prior" de Ulyanov et al. (CVPR 2018) Neste artigo, eles exploraram a ideia de que a maneira como as redes neurais de bom desempenho para o processamento de imagens são projetadas reflete de perto nossa idéia de como deve ser uma imagem natural (a distribuição "anterior").
Eles propuseram um método que pode ser usado para pintar, além de remover ruídos e artefatos, que apenas usa a imagem fornecida sem treinamento em nenhum outro dado. O conceito atual é bastante simples: a rede é treinada para produzir a imagem desejada (para algum ruído aleatório fixo como entrada) penalizando apenas os erros fora de uma determinada máscara. Se você deseja remover o ruído, não precisa mascarar nada, mas basta parar no início do treinamento.
Para pintar, você mascara a peça que deseja pintar e treina até a convergência. Certamente não é o estado da arte, mas eu ainda queria publicá-lo e publicá-lo aqui devido à simplicidade da ideia e ao desempenho ainda notável. Nas minhas experiências, a pintura de remendos maiores não resultou tão bem, mas para segmentos menores os resultados podem ser muito mais convincentes.
Eu implementei isso usando a popular arquitetura U-Net da jaxony no github . O código para treinar e processar as imagens pode ser encontrado abaixo.
Treinamento
Esta é uma visualização do processo de treinamento. Cada quadro é o estado de um certo número de iterações:
Exemplos
Código
Observe que em uma CPU, isso pode levar horas para executar apenas uma imagem, enquanto uma boa GPU habilitada para cuda pode levar muito menos tempo.
fonte
Python com OpenCV
O OpenCV possui uma função chamada inpaint. Existem dois tipos de pintura usados, vou usar o método de marcha rápida. De acordo com a documentação, o algoritmo funciona assim:
Aqui está o código *:
Observe como eu converto o BGR em RGB por motivos de plotagem. Além disso, eu giro. Aqui estão os resultados:
Mona Lisa retorna!
Como você pode ver, não sou o melhor com as duas cores.
fonte
Java
Uma abordagem de média de cores. Provavelmente pode ser melhorado.
Resultados:
fonte