Como qualquer fotógrafo amador pode dizer, pós-processamento extremo é sempre bom. Uma dessas técnicas é chamada de " falsificação em miniatura ".
O objetivo é fazer com que uma imagem pareça uma fotografia de uma versão em miniatura de brinquedo em si. Isso funciona melhor para fotografias tiradas de um ângulo moderado / alto em relação ao solo, com uma baixa variação na altura do assunto, mas pode ser aplicado com eficácia variável a outras imagens.
O desafio: tire uma fotografia e aplique um algoritmo de falsificação em miniatura. Há muitas maneiras de fazer isso, mas, para os propósitos deste desafio, tudo se resume a:
Desfoque seletivo
Alguma parte da imagem deve ficar embaçada para simular uma profundidade de campo rasa. Isso geralmente é feito ao longo de algum gradiente, linear ou moldado. Escolha o algoritmo de desfoque / gradiente desejado, mas entre 15% a 85% da imagem deve ter desfoque "perceptível".
Impulso de saturação
Aumente a cor para fazer as coisas parecerem pintadas à mão. A saída deve ter um nível de saturação médio de> + 5% quando comparada à entrada. (usando saturação HSV )
Reforço de contraste
Aumente o contraste para simular condições de iluminação mais severas (como a luz interna / de estúdio, em vez de o sol). A saída deve ter um contraste de> + 5% quando comparada à entrada. (usando o algoritmo RMS )
Essas três alterações devem ser implementadas e nenhuma outra melhoria / alteração é permitida. Sem cortes, nitidez, ajustes de balanço de branco, nada.
A entrada é uma imagem e pode ser lida a partir de um arquivo ou memória. Você pode usar bibliotecas externas para ler e gravar a imagem, mas não pode usá-las para processar a imagem. As funções fornecidas também não são permitidas para esse fim (você não pode simplesmente chamar,
Image.blur()
por exemplo)Não há outra entrada. As forças, níveis, etc. do processamento devem ser determinados pelo programa, não por um ser humano.
A saída pode ser exibida ou salva como um arquivo em um formato de imagem padronizado (PNG, BMP, etc).
Tente generalizar. Não deve funcionar apenas em uma imagem, mas é compreensível que não funcione em todas as imagens. Algumas cenas simplesmente não respondem bem a essa técnica, por melhor que seja o algoritmo. Aplique o bom senso aqui, ao responder e votar nas respostas.
O comportamento é indefinido para entradas inválidas e para as imagens impossíveis de satisfazer as especificações. Por exemplo, uma imagem em escala de cinza não pode ser saturada (não há matiz de base), uma imagem em branco puro não pode ter maior contraste etc.
Inclua pelo menos duas imagens de saída na sua resposta:
É necessário gerar uma das imagens nesta pasta da caixa de depósito . Há seis para escolher, mas tentei torná-los todos viáveis em diferentes graus. Você pode ver exemplos de saídas para cada um na
example-outputs
subpasta. Observe que estas são imagens JPG de 10MP completas diretamente da câmera, para que você tenha muitos pixels para trabalhar.O outro pode ser qualquer imagem de sua escolha. Obviamente, tente escolher imagens que possam ser usadas livremente. Além disso, inclua a imagem original ou um link para comparação.
Por exemplo, nesta imagem:
Você pode produzir algo como:
Para referência, o exemplo acima foi processado no GIMP com um desfoque gaussiano de gradiente angular em forma de caixa, saturação +80, contraste +20. (Não sei quais unidades o GIMP usa para elas)
Para obter mais inspiração ou para ter uma idéia melhor do que você está tentando alcançar, consulte este site ou este . Você também pode procurar miniature faking
e tilt shift photography
obter exemplos.
Este é um concurso de popularidade. Eleitores, vote nas entradas que você achar melhor, mantendo-se fiel ao objetivo.
Esclarecimento:
Esclarecendo quais funções são proibidas, não era minha intenção banir funções matemáticas . Minha intenção era proibir as funções de manipulação de imagens . Sim, existem algumas sobreposições, mas coisas como FFT, convoluções, matemática matricial etc. são úteis em muitas outras áreas. Você não deve usar uma função que simplesmente captura uma imagem e desfoca. Se você encontrar uma maneira matemática adequada de criar um desfoque, esse jogo justo.
fonte
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, eImageAdjust
.) Mesmo com a ajuda de tais funções de processamento de imagem de alto nível, o código ocupa 22 k. O código para a interface do usuário ainda é muito pequeno.Respostas:
Java: Implementação de Referência
Aqui está uma implementação de referência básica em Java. Funciona melhor em fotos de alto ângulo e é terrivelmente ineficiente.
O desfoque é um desfoque de caixa muito básico, portanto passa pelos mesmos pixels muito mais do que o necessário. O contraste e saturação podem ser combinados em um único loop, mas a grande maioria do tempo gasto é borrada, para que não haja muito ganho com isso. Dito isto, ele funciona rapidamente em imagens com menos de 2MP. A imagem de 10MP levou algum tempo para ser concluída.
A qualidade do desfoque pode ser facilmente aprimorada usando basicamente qualquer coisa, menos um desfoque de caixa plana. Os algoritmos de contraste / saturação fazem seu trabalho, portanto, não há queixas reais por lá.
Não há inteligência real no programa. Ele usa fatores constantes para o desfoque, saturação e contraste. Eu brinquei com ele para encontrar configurações médias felizes. Como resultado, há são algumas cenas que não fazem muito bem. Por exemplo, ele bombeia tanto o contraste / saturação que as imagens com grandes áreas de cores semelhantes (think sky) se dividem em faixas coloridas.
É simples de usar; apenas passe o nome do arquivo como o único argumento. Ele gera em PNG, independentemente do arquivo de entrada.
Exemplos:
Na seleção da caixa de depósito:
Essas primeiras imagens são reduzidas para facilitar a postagem. Clique na imagem para ver em tamanho real.
Depois de:
Antes:
Seleção variada:
Depois de:
Antes:
fonte
C #
Em vez de fazer qualquer borrão iterativo da caixa, decidi percorrer todo o caminho e escrever um borrão gaussiano. As
GetPixel
chamadas realmente diminuem a velocidade ao usar kernels grandes, mas não vale a pena converter os métodos para uso, aLockBits
menos que processemos algumas imagens maiores.Alguns exemplos estão abaixo, que usam os parâmetros de ajuste padrão que eu defini (não brinquei muito com os parâmetros de ajuste, porque eles pareciam funcionar bem para a imagem de teste).
Para o caso de teste fornecido ...
Outro...
Outro...
Os aumentos de saturação e contraste devem ser bastante diretos a partir do código. Eu faço isso no espaço HSL e o converto novamente em RGB.
O kernel Gaussiano 2D é gerado com base no tamanho
n
especificado, com:... e normalizado após a atribuição de todos os valores do kernel. Observe que
A=sigma_x=sigma_y=1
.Para descobrir onde aplicar o kernel, eu uso um peso de desfoque, calculado por:
... que fornece uma resposta decente, criando essencialmente uma elipse de valores que são protegidos do desfoque que desaparece gradualmente. Um filtro passa-banda combinado com outras equações (talvez uma variante de
y=-x^2
) poderia funcionar melhor aqui para determinadas imagens. Fui com o cosseno porque deu uma boa resposta para o caso base que testei.fonte
Java
Usa um rápido desfoque de caixa bidirecional com média de execução rápida para ser rápido o suficiente para executar vários passes, emulando um desfoque gaussiano. O desfoque é um gradiente elíptico em vez de bi-linear também.
Visualmente, funciona melhor em imagens grandes. Tem um tema mais escuro e sujo. Estou feliz com a forma como o desfoque resultou em imagens de tamanho apropriado, é bastante gradual e difícil de discernir onde "começa".
Todos os cálculos feitos em matrizes de números inteiros ou duplos (para HSV).
Espera o caminho do arquivo como argumento, gera o arquivo no mesmo local com o sufixo "miniaturized.png" Também exibe a entrada e a saída em um JFrame para visualização imediata.
(clique para ver versões grandes, elas são muito melhores)
Antes:
Depois de:
Talvez eu precise adicionar um mapeamento de tom mais inteligente ou preservação da luma, pois pode ficar bem escuro:
Antes:
Depois de:
Ainda interessante, porém, o coloca em uma atmosfera totalmente nova.
O código:
fonte
J
Este foi um bom desafio. As configurações de desfoque, saturação e contraste são codificadas, mas podem ser facilmente alteradas, se desejado. No entanto, a área em foco é codificada como uma linha horizontal no centro. Não pode ser simplesmente modificado como as outras configurações. Foi escolhido porque a maioria das imagens de teste apresenta vistas de uma cidade.
Depois de realizar um desfoque gaussiano, dividi a imagem horizontalmente em 5 regiões. As regiões superior e inferior receberão 100% do desfoque. A região do meio receberá 0% do desfoque. As duas regiões restantes serão dimensionadas proporcionalmente ao cubo inverso de 0% a 100%.
O código deve ser usado como um script em J e esse script estará na mesma pasta em
input.bmp
que será a imagem de entrada. Ele criaráoutput.bmp
uma miniatura falsa da entrada.O desempenho é bom e, no meu PC, usando um i7-4770k, leva cerca de 20 segundos para processar uma imagem do conjunto do OP. Anteriormente, eram necessários cerca de 70 segundos para processar uma imagem usando convolução padrão com o
;._3
operador de subarray. O desempenho foi aprimorado usando a FFT para realizar a convolução.Este código exige que o
bmp
emath/fftw
complementos para ser instalado. Você pode instalá-los usandoinstall 'bmp'
einstall 'math/fftw'
. Seu sistema também pode precisar da instalação dafftw
biblioteca.fonte