Não tenho certeza se alguém já explicou por que o número mágico parece ser exatamente 1: 2 e não, por exemplo, 1: 1,1 ou 1:20.
Uma razão é que, em muitos casos típicos, quase metade dos dados digitalizados é ruído e o ruído (por definição) não pode ser compactado.
Eu fiz um experimento muito simples:
Peguei um cartão cinza . Para um olho humano, parece um pedaço simples e neutro de papelão cinza. Em particular, não há informações .
E então eu peguei um scanner normal - exatamente o tipo de dispositivo que as pessoas podem usar para digitalizar suas fotos.
Examinei o cartão cinza. (Na verdade, digitalizei o cartão cinza junto com um cartão postal. O cartão postal estava lá para verificação de sanidade, para garantir que o software do scanner não faça nada de estranho, como adicionar automaticamente contraste ao ver o cartão cinza inexpressivo.)
Recortei uma parte de 1000x1000 pixels do cartão cinza e a converti em escala de cinza (8 bits por pixel).
O que temos agora deve ser um bom exemplo do que acontece quando você estuda uma parte inexpressiva de uma foto em preto e branco digitalizada , por exemplo, céu claro. Em princípio, não deveria haver exatamente nada para ver.
No entanto, com uma ampliação maior, fica assim:
Não há um padrão claramente visível, mas ele não tem uma cor cinza uniforme. Parte disso é provavelmente causada pelas imperfeições do cartão cinza, mas eu diria que a maioria é simplesmente ruído produzido pelo scanner (ruído térmico na célula do sensor, amplificador, conversor A / D etc.). Parece muito com o ruído gaussiano; aqui está o histograma (em escala logarítmica ):
Agora, se assumirmos que cada pixel tem seu tom escolhido nesta distribuição, quanta entropia temos? Meu script Python me disse que temos até 3,3 bits de entropia por pixel . E isso é muito barulho.
Se esse fosse realmente o caso, implicaria que, independentemente do algoritmo de compactação usado, o bitmap de 1000 x 1000 pixels seria compactado, na melhor das hipóteses, em um arquivo de 412500 bytes. E o que acontece na prática: eu tenho um arquivo PNG de 432018 bytes, bem próximo.
Se generalizarmos um pouco demais, parece que não importa quais fotos em preto e branco digitalizo com este scanner, obteremos a soma do seguinte:
- informações "úteis" (se houver),
- barulho, aprox. 3 bits por pixel.
Agora, mesmo que seu algoritmo de compactação comporte as informações úteis em << 1 bits por pixel, você ainda terá até 3 bits por pixel de ruído incompressível. E a versão não compactada é de 8 bits por pixel. Portanto, a taxa de compressão estará no campo de 1: 2, não importa o que você faça.
Outro exemplo, com uma tentativa de encontrar condições super idealizadas:
- Uma câmera DSLR moderna, usando a configuração de sensibilidade mais baixa (menos ruído).
- Uma foto fora de foco de um cartão cinza (mesmo que houvesse alguma informação visível no cartão cinza, ela seria borrada).
- Conversão do arquivo RAW em uma imagem em escala de cinza de 8 bits, sem adicionar nenhum contraste. Eu usei configurações típicas em um conversor RAW comercial. O conversor tenta reduzir o ruído por padrão. Além disso, estamos salvando o resultado final como um arquivo de 8 bits - estamos, essencialmente, jogando fora os bits de ordem mais baixa das leituras brutas do sensor!
E qual foi o resultado final? Parece muito melhor do que o que recebi do scanner; o barulho é menos pronunciado e não há exatamente nada a ser visto. No entanto, o barulho gaussiano está lá:
E a entropia? 2,7 bits por pixel . Tamanho do arquivo na prática? 344923 bytes para 1M pixels. Em um cenário realmente melhor, com algumas trapaças, aumentamos a taxa de compactação para 1: 3.
É claro que tudo isso não tem nada a ver com a pesquisa da TCS, mas acho que é bom ter em mente o que realmente limita a compactação de dados digitalizados no mundo real. Os avanços no design de algoritmos de compressão mais sofisticados e no poder bruto da CPU não ajudarão; se você quiser economizar todo o ruído sem perdas, não poderá fazer muito melhor que 1: 2.