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
.