Coloque uma imagem em escala de cinza em preto e branco puro com seu próprio algoritmo.
Diretrizes: você deve criar seu próprio novo algoritmo. Você não pode usar algoritmos preexistentes (por exemplo, Floyd-Steinburg), mas pode usar a técnica geral. Seu programa deve ser capaz de ler uma imagem e produzir uma imagem do mesmo tamanho. Este é um concurso de popularidade, e quem produz o melhor (o mais próximo do original) e o mais criativo (determinado por votos) vence. Bônus se o código for curto, embora isso não seja necessário.
Você pode usar qualquer imagem em escala de cinza que desejar como entrada, que deve ser maior que 300x300. Qualquer formato de arquivo está correto.
Exemplo de entrada:
Exemplo de saída:
Este é um trabalho muito bom, mas ainda existem linhas e padrões visíveis.
Respostas:
Fortran
Ok, estou usando um formato de imagem obscuro chamado FITS, usado para astronomia. Isso significa que existe uma biblioteca Fortran para ler e escrever essas imagens. Além disso, o ImageMagick e o Gimp podem ler / gravar imagens FITS.
O algoritmo usado é baseado no pontilhamento "Sierra Lite", mas com duas melhorias:
a) reduzo o erro propagado por um fator 4/5.
b) Eu introduzo uma variação aleatória na matriz de difusão, mantendo sua soma constante.
Juntos, eles quase eliminam completamente os padrões vistos no exemplo dos OPs.
Supondo que você tenha a biblioteca CFITSIO instalada, compile com
Os nomes dos arquivos são codificados (não se pode incomodar em corrigir isso).
Código:
Exemplo de saída para a imagem do filhote de cachorro em OPs post:
OPs example output:
fonte
GraphicsMagick / ImageMagick
Pontilhamento ordenado:
Antes de reclamar sobre o uso de um "algoritmo estabelecido", leia o ChangeLog for GraphicsMagick e ImageMagick para abril de 2003, onde você verá que eu implementei o algoritmo nesses aplicativos. Além disso, a combinação de "-gamma .45455" com "-ordered-dither" é nova.
O "-gamma .45455" cuida da imagem ser muito clara. O parâmetro "all" é necessário apenas com GraphicsMagick.
Há faixas porque existem apenas 17 níveis de cinza em uma imagem pontilhada 4x4. A aparência das faixas pode ser reduzida usando um pontilhado 8x8 com 65 níveis.
Aqui está a imagem original, a saída pontilhada ordenada 4x4 e 8x8 e a saída com limite aleatório:
Prefiro a versão com pontilhamento ordenado, mas estou incluindo a versão com limite aleatório para fins de completude.
O "10x90%" significa renderizar abaixo de 10% de pixels de intensidade em preto puro e acima de 90% em branco puro, para evitar ter algumas manchas solitárias nessas áreas.
Provavelmente vale a pena notar que ambos são tão eficientes quanto possível à memória. Como não há difusão, eles trabalham um pixel de cada vez, mesmo quando escrevem blocos de pontilhamento ordenado, e não precisam saber nada sobre os pixels vizinhos. ImageMagick e GraphicsMagick processam uma linha por vez, mas não é necessário para esses métodos. As conversões de pontilhamento ordenado levam menos de 0,04 segundo em tempo real no meu antigo computador x86_64.
fonte
Peço desculpas pelo estilo do código, juntei isso usando algumas bibliotecas que acabamos de criar na minha classe java, e há um caso ruim de copiar e colar e números mágicos. O algoritmo seleciona retângulos aleatórios na imagem e verifica se o brilho médio é maior na imagem pontilhada ou na imagem original. Em seguida, liga ou desliga um pixel para aproximar o brilho da linha, escolhendo preferencialmente pixels mais diferentes da imagem original. Eu acho que faz um trabalho melhor destacando detalhes finos como o cabelo do filhote, mas a imagem é mais barulhenta porque tenta mostrar detalhes mesmo em áreas sem nenhum.
fonte
Ghostscript (com pouca ajuda do ImageMagick)
Longe de ser meu 'novo algoritmo', mas, desculpe, não pude resistir.
É claro que funciona melhor sem restrição do 'mesmo tamanho'.
fonte
JAVA
Aqui está a minha submissão. Pega uma imagem JPG, calcula a luminosidade pixel por pixel (graças a Bonan nesta pergunta SO) e, em seguida, verifica-a em um padrão aleatório para saber se o pixel resultante será preto ou branco. Os pixels de Darkerst serão sempre pretos e os pixels mais brilhantes sempre serão brancos para preservar os detalhes da imagem.
Outros exemplos:
Também funciona com imagens coloridas:
fonte
CJam
95 bytes :)
Ele usa o formato ASCII PGM (P2) sem linha de comentário, para entrada e saída.
O método é muito básico: soma quadrados de 2 * 2 pixels, converte para o intervalo 0..4 e depois usa um padrão correspondente de 4 bits para gerar 2 * 2 pixels em preto e branco.
Isso também significa que a largura e a altura devem ser uniformes.
Amostra:
E um algoritmo aleatório em apenas 27 bytes:
Ele usa o mesmo formato de arquivo.
Amostra:
E, finalmente, uma abordagem mista: pontilhamento aleatório com tendência a um padrão quadriculado; 44 bytes:
Amostra:
fonte
Java (1.4 ou superior)
Não tenho certeza se estou reinventando a roda aqui, mas acho que ela pode ser única ...
Com sequências aleatórias limitadas
Pontilhamento aleatório puro
Imagem da cidade da resposta de Averroes
O algoritmo usa o conceito de energia de luminosidade localizada e normaliza para reter recursos. A versão inicial usou um jitter aleatório para produzir uma aparência distorcida sobre áreas de luminosidade semelhante. No entanto, não era tão visualmente atraente. Para contrariar isso, um conjunto limitado de sequências aleatórias limitadas é mapeado para a luminosidade bruta do pixel de entrada e as amostras são usadas iterativamente e repetidamente produzindo fundos com aparência pontilhada.
fonte
Python
A idéia é a seguinte: A imagem é dividida em
n x n
blocos. Calculamos a cor média de cada uma dessas peças. Em seguida, mapeamos o intervalo de cores0 - 255
para o intervalo0 - n*n
que nos fornece um novo valorv
. Em seguida, colorimos todos os pixels desse bloco de preto e colorimos aleatoriamente osv
pixels desse bloco de branco. Está longe de ser o ideal, mas ainda nos dá resultados reconhecíveis. Dependendo da resolução, geralmente funciona melhorn=2
oun=3
. Enquanton=2
você já pode encontrar artefatos a partir da profundidade de cor simulada, cason=3
já possa ficar um pouco desfocado. Eu assumi que as imagens deveriam permanecer do mesmo tamanho, mas é claro que você também pode usar esse método e apenas dobrar / triplicar o tamanho da imagem gerada para obter mais detalhes.PS: Eu sei que estou um pouco atrasado para a festa, lembro que não tinha nenhuma idéia quando o desafio começou, mas agora só tinha essa onda cerebral =)
Resultados:
n=2:
n=3:
fonte
Vamos definir um formato de arquivo teórico muito compacto para esta pergunta, já que qualquer um dos formatos de arquivo existentes possui sobrecarga demais para a qual responder rapidamente.
Deixe os quatro primeiros bytes do arquivo de imagem definirem a largura e a altura da imagem em pixels, respectivamente:
seguido por
w * h
bytes de valores em escala de cinza de 0 a 255:Em seguida, podemos definir um trecho de código em Python (145 bytes) que obterá esta imagem e fará:
que "se estraga" retornando branco ou preto com probabilidade igual ao valor da escala de cinza desse pixel.
Aplicado na imagem de amostra, fornece algo como isto:
Não é muito bonito, mas parece muito semelhante quando reduzido em uma visualização e, para apenas 145 bytes de Python, não acho que você possa melhorar muito.
fonte
Cobra
Toma um arquivo PNG / BMP de 24 ou 32 bits (o JPG produz saída com alguns tons de cinza). Também é extensível a arquivos que contêm cores.
Ele usa ELA com velocidade otimizada para pontilhar a imagem em cores de 3 bits, que retornarão em preto / branco quando receber a imagem de teste.
Eu mencionei que é muito rápido?
fonte
col
e deixar a opçãoimage.setPixel(x,y,col)
até o final?Java
Código de baixo nível, usando PNGJ e uma adição de ruído mais difusão básica. Esta implementação requer uma fonte PNG de 8 bits em escala de cinza.
(Adicione este jar ao seu caminho de construção, se você quiser experimentá-lo).
Como um bônus: isso é extremamente eficiente no uso de memória (armazena apenas três linhas) e pode ser usado para imagens enormes.
fonte
Java
Apenas um algoritmo simples baseado em RNG, além de alguma lógica para lidar com imagens coloridas. Tem a probabilidade b de definir qualquer pixel para branco, define-o como preto; onde b é o brilho original desse pixel.
Aqui está um resultado potencial para a imagem do cão:
fonte