Neste desafio, você criará um algoritmo de compactação de visualização de imagem. Seu objetivo é reduzir um arquivo de imagem arbitrário para uma imagem de visualização de 4 KiB, que pode ser usada para identificar rapidamente imagens com muito pouca largura de banda.
Você deve escrever dois programas (ou um programa combinado): um compressor e um descompressor. Ambos devem pegar um arquivo ou stdin como entrada e enviar para um arquivo ou stdout. O compressor deve aceitar uma imagem em um formato de imagem convencional sem perdas de escolha (por exemplo, PNG, BMP, PPM) e gerar um arquivo com no máximo 4096 bytes . O descompactador deve aceitar qualquer arquivo gerado pelo compressor e gerar uma imagem o mais próximo possível da entrada. Observe que não há limite de tamanho do código-fonte para o codificador / decodificador, para que você possa ser criativo em seu algoritmo.
Restrições:
Sem 'trapaça'. Seus programas não podem usar entradas ocultas, armazenamento de dados na Internet etc. Você também está proibido de incluir recursos / dados pertencentes apenas ao conjunto de imagens de pontuação.
Para bibliotecas / ferramentas / built-ins que você está autorizado a usar genéricos operações de processamento de imagem (scaling, borrar, cor espaço de transformação, etc), mas não imagem decodificação / codificação / compressão de operações (exceto para a entrada do compressor e descompressor de saída). A compactação / descompactação genérica também não é permitida . Pretende-se implementar sua própria compactação para esse desafio.
As dimensões da imagem gerada pelo descompactador devem corresponder exatamente às do arquivo original fornecido ao compressor. Você pode supor que as dimensões da imagem não excedam 2 16 em qualquer direção.
O seu compressor deve funcionar em um PC de consumo médio em menos de 5 minutos e o descompactador deve funcionar em menos de 10 segundos para qualquer imagem no conjunto abaixo.
Pontuação
Para ajudar na verificação rápida e na comparação visual, inclua um álbum de imagem sem perdas do corpus de teste após a compactação usando sua resposta.
Seu compressor será testado usando o seguinte corpus de imagens :
Você pode baixar todas as imagens em um arquivo zip aqui .
Sua pontuação será o índice de similaridade estrutural médio para o seu compressor em todas as imagens. Usaremos o código aberto dssim
para esse desafio. É facilmente construído a partir da fonte ou, se você estiver no Ubuntu, também possui um PPA. É preferível que você avalie sua própria resposta, mas se você não sabe como criar aplicativos C e não executa o Debian / Ubuntu, pode deixar que outra pessoa faça sua avaliação. dssim
espera entrada / saída em PNG, então converta sua saída em PNG primeiro, se você produzir em um formato diferente.
Para tornar a pontuação indolor, aqui está um script Python auxiliar rápido, uso python score.py corpus_dir compressed_dir
:
import glob, sys, os, subprocess
scores = []
for img in sorted(os.listdir(sys.argv[1])):
ref, preview = (os.path.join(sys.argv[i], img) for i in (1, 2))
sys.stdout.write("Comparing {} to {}... ".format(ref, preview))
out = subprocess.check_output(["dssim", ref, preview]).decode("utf-8").split()[0]
print(out)
scores.append(float(out))
print("Average score: {:.6f}".format(sum(scores) / len(scores)))
Menor pontuação ganha.
You may assume that the image dimensions do not exceed 2^32 in either direction.
Isso não é um pouco excessivo? Isso significa que eu tenho que usar 16 bytes para armazenar um par de coordenadas (x, y). Poucos arquivos de imagem têm dimensões superiores a 2 ^ 16 (65536) pixels em qualquer direção e 2 ^ 11 é suficiente para todas as imagens no corpus.2^16
.Respostas:
Python com PIL, pontuação 0,094218
Compressor:
Descompressor:
Ambos os scripts recebem entrada por meio de argumentos de linha de comando, como dois diretórios (entrada e saída), e convertem todas as imagens no diretório de entrada.
A idéia é encontrar um tamanho que caiba abaixo de 4 KiB e tenha a mesma proporção que o original e use um filtro Lanczos para obter o máximo de qualidade possível da imagem reduzida na amostra.
Álbum de imagens compactadas, após redimensionar para as dimensões originais
Pontuação do script de saída:
fonte
Java (baunilha, deve funcionar com java 1.5 ou superior), pontuação 0,672
Não gera pontuações dssim particularmente boas, mas, a meu ver, produz imagens mais amigáveis ao ser humano ...
Álbum: http://imgur.com/a/yL31U
Pontuação do script de saída:
A cadeia de compressão:
Para descompactar, inflar e, em seguida, ler os índices do bloco e enviar o patch correspondente ao arquivo de saída e redimensionar para as dimensões originais.
Infelizmente, o código é muito grande para o stackoverflow, portanto, pode ser encontrado em https://gist.github.com/anonymous/989ab8a1bb6ec14f6ea9
Para correr:
Na primeira vez em que esse aplicativo é executado, os arquivos necessários serão gerados e salvos em um diretório relativo ao diretório de trabalho de execução. Isso pode levar alguns minutos. Para execuções subseqüentes, esta etapa não precisará ser executada.
fonte