Qual é o padrão menos compressível para JPG? (o pano de filmagem da câmera, escala / ângulo / iluminação pode variar)

46

Estou tentando criar um pano que, do ponto de vista de uma câmera, seja muito difícil de compactar com JPG, resultando em arquivos de tamanho grande (ou levando a uma baixa qualidade de imagem se o tamanho do arquivo for fixo).

Ele deve funcionar mesmo que o pano esteja longe da câmera ou seja girado (digamos que a escala possa variar de 1x a 10x).

O ruído é bastante bom (difícil de compactar), mas fica cinza ao olhar de longe, tornando-se fácil de compactar. Um bom padrão seria uma espécie de fractal , parecido em todas as escalas.
A folhagem é melhor (folhas, galhos minúsculos, galhos pequenos, galhos grandes), mas usa poucas cores.

Aqui está uma primeira tentativa: Mais não compactável

Estou certo de que existem padrões mais ótimos.
Talvez as pavimentações em hexágono ou triângulo tenham um desempenho melhor.

O JPG usa o espaço de cores Y ′ Cb Cr , acho que o Cb Cr pode ser gerado de maneira semelhante, mas acho que é melhor não usar uniformemente todo o escopo de Y '(brilho), pois a câmera saturará as áreas claras ou escuras ( a iluminação nunca é perfeita).

PERGUNTA: Qual é o padrão ideal de pano para esse problema?

Nicolas Raoul
fonte
1
Vou ter que ficar de olho nessa pergunta .... se uma resposta interessante for alcançada, posso prever um pedido de tecido em www.spoonflower.com (ou um serviço similar) e uma camisa realmente difícil de adicionar para adicionar para a minha coleção ;-)
RBerteig
Um projeto interessante de competição de padrões poderia ser: 1) Tire uma imagem de alta definição desse padrão 2) Gire-o, pegue uma porção aleatória (em escala aleatória), desfoque um pouco, adicione um pouco de ruído e pequenas cores aleatórias desvio 3) Comprima com JPG 4) Veja o tamanho do arquivo, calcule métricas sobre a perda de qualidade e calcule a "pontuação" usando essas métricas. 5) Repita várias vezes para convergir para a pontuação média desse padrão. 6) Repita com outros padrões e compare as pontuações
Nicolas Raoul
1
Como os algoritmos com perdas sempre podem compactar mais jogando fora mais dados, parece que você teria mais sorte com o uso de padrões que dependem dos detalhes de alta frequência. Por exemplo, linhas finas. Em outras palavras, ele pode se comprimir bem, mas diminui a qualidade muito rapidamente. Depende do que você deseja realizar, suponho. Pense em impressões digitais - é um caso clássico em que wavelets eram necessárias para uma boa compactação em JPEG devido à necessidade de preservar os detalhes.
datageist
@datageist: Pode ser difícil compactar uma imagem (saída da câmera não processada) de um tecido com linhas, mas retroceda e tire outra foto: ela conterá apenas pixels cinza, muito fácil de comprimir sem quase nenhuma perda. O padrão que estou procurando deve resultar em imagens (saída bruta da câmera) que são difíceis de compactar em uma ampla variedade de escalas.
Nicolas Raoul
@NicolasRaoul Certo, entendi, só estou dizendo que qualquer coisa é compressível se você jogar fora informações suficientes. Você quer apenas um padrão que tenha a distinção de ser "difícil de compactar" (por diversão), ou está tentando desencorajar ativamente as pessoas de tentar compactar imagens que contenham o padrão?
datageist

Respostas:

15

O ruído é bastante bom (difícil de compactar), mas fica cinza ao olhar de longe, tornando-se fácil de compactar. Um bom padrão seria uma espécie de fractal, parecido em todas as escalas.

Bem, há ruído fractal . Eu acho que o ruído browniano é fractal, parecendo o mesmo que você aumenta o zoom. A Wikipedia fala sobre adicionar o ruído Perlin a si mesmo em diferentes escalas para produzir ruído fractal, que talvez seja idêntico, não tenho certeza:

Ruído fractal Perlin

Eu não acho que isso seria difícil de comprimir, no entanto. O ruído é difícil para a compactação sem perdas, mas o JPEG é com perdas, por isso apenas descartará os detalhes, em vez de lutar com ele. Não tenho certeza se é possível tornar algo "difícil para o JPEG compactar", pois ele ignora qualquer coisa que é muito difícil de compactar nesse nível de qualidade.

Algo com arestas duras em qualquer escala provavelmente seria melhor, como o plano infinito de xadrez:

plano de xadrez infinito

Também algo com muitas cores. Talvez veja os fractais reais em vez do ruído fractal. Talvez um fractal Mondriano ? :)

Fractal Mondrian

endólito
fonte
1
Muito obrigado! O ruído fractal é definitivamente o tipo de coisa que eu estava procurando, mas em meus testes é bem compactado, acho que poderia usar uma transição mais abrupta, em vez de uma suavidade semelhante ao mapa de calor. O problema do tabuleiro de xadrez é que o desempenho realmente depende de qual parte do pano é tirada na foto. O fractal Mondrian é ótimo, e o melhor desempenho em meus testes até agora. Talvez pudesse usar mais cores e parâmetros ligeiramente diferentes.
Nicolas Raoul
@NicolasRaoul: Hmm ... Talvez o tapete Sierpinski com cores ? Esse já é um padrão de colcha comum .
Endolith 11/04
Um mosaico de triângulos ou quadrados de Sierpinski pode realmente ser ótimo!
Nicolas Raoul
14

Se falássemos de imagens geradas por computador, o ruído seria a abordagem correta. Mas aqui, há a etapa de captura da câmera.

O bit fractal é muito importante devido ao problema de invariância da escala. No entanto, não precisa ser verdadeiramente fractal, se você considerar que há uma distância limitada na qual a pessoa será fotografada. Quero dizer, se a pessoa que usa o pano estiver no fundo de uma foto, de qualquer forma, não terá muito impacto ...

Eu acho que a melhor maneira de enganar o codificador JPEG seria ter blocos com coeficientes de alta frequência muito altos que sobreviverão à quantização = muitos detalhes e bordas nítidas; portanto, toda a sequência do coeficiente deve ser escrita explicitamente (em vez de um EOB no 15º coeficiente). O padrão quadriculado é uma boa maneira de conseguir isso. A única desvantagem que vejo é que a baixa resolução da lente + os filtros antialiasing da câmera têm uma boa chance de desfocar isso! Tudo deve acontecer em blocos de 8x8 (ou 16x16 em cromatografia) porque o JPEG não faz muito na escala macro. Você precisa tornar seus blocos de 8x8 o mais confusos possível, não importa o quão embaçada a lente os torne.

Aqui está uma sugestão:

padrão invariável em escala, difícil de compactar para JPEG

Você pode se perguntar o que os blocos menos contrastados estão fazendo aqui, mas eles ajudam a manter a zona contrastada quando a coisa é reduzida. O desafio aqui é ter algo com um padrão contrastado, independentemente da escala de visualização.

Não avaliei formalmente isso. A melhor maneira seria ter um script que capture a imagem, aplique uma dúzia de recortar / redimensionar / desfoque com vários parâmetros e cuspa o tamanho total dos JPEGs.

pichenettes
fonte
Muito obrigado! Parece bastante semelhante ao meu conceito de imagem em questão, na verdade, mas muito melhor. Alguma razão específica para a "fratalidade" ser pelo fator 4? É melhor que o fator 2?
Nicolas Raoul
sem motivo, tentei fazer com que parecesse mais bonita com mais tons de cor, então comecei com um quadrado 4x4.
Pichenettes
Alguma razão para escolher quadrados em vez de triângulos? Eu estou tentando agora, triângulos fazem muitas arestas, o que eu acho que é bom. Uma baixa "fratalidade" poderia ser alcançada com uma abordagem híbrida triângulo → losango → hexágono → triângulo. Eu acho que um fator baixo é uma coisa boa, pois aumenta a probabilidade da câmera detectar formas nítidas até o seu limite de resolução.
Nicolas Raoul
Praças era a coisa mais fácil de codificar. Não tenho certeza se outras formas têm uma "densidade de arestas" melhor do que os quadrados.
Pichenettes
11

Há uma diferença entre o JPEG explorável e o Transform Compressible.

Veja o ruído branco granulado do aparelho de TV, por exemplo.

Um ruído branco geral é espalhado ao máximo na frequência e, portanto, não há exemplo melhor do que o ruído branco que qualquer técnica de codificação de domínio de transformação não pode comprimir. Se você tomar esse ruído e usar o DCT (ou DFT, se necessário), descobriremos que o domínio da frequência também é amplo e todos os coeficientes terão importância.

No entanto, ainda ninguém o impede de ser agressivo com a quantização. Dessa forma, você ainda pode descartar quantidades pesadas das regiões de alta frequência. O resultado terá um forte erro médio quadrado. No entanto, perceptivamente, ainda seria ruído. Pode estar muito embaçado.

Por outro lado, agora tire fotos onde houver bordas nítidas.

As arestas vivas também terão se espalhado na frequência mais alta (mas pode ser que seja apenas um pouco menos que no caso anterior). No entanto, ao tentar comprimir e diminuir a alta frequência, agora haverá severos impedimentos visualmente. Isso introduzirá o embaçamento das bordas, o efeito de toque, etc. Embora a largura de banda espalhada para essas imagens não seja a mais alta possível, para JPEG ou qualquer compactação equivalente, é difícil manter essas imagens com qualidade perceptualmente igual.

Para qualquer compressão com perdas, resistente e simples depende de quanto e que tipo de distorção é tolerada.

Dipan Mehta
fonte
Digamos que meu tecido seja uma tabela 10 ^ 8x10 ^ 8 de pixels aleatórios em preto / branco. A câmera tira uma foto de 10x10 pixels do tecido. Estatisticamente, essa imagem 10x10 não terá todos os pixels em um cinza muito semelhante, facilitando a compressão com menos distorção (de qualquer tipo) do que uma imagem menos uniforme?
Nicolas Raoul
10

A composição abaixo mostra uma estrutura do tipo fractal do padrão. Todas as próximas imagens são o resultado da média de cada bloco de 2x2 pixels da anterior. O caráter total do padrão permanece o mesmo, mas o contraste da imagem está diminuindo gradualmente. Como foi dito anteriormente, a imagem fica cinza quando diminuímos o zoom.

Comportamento de escala

Mas, usando a propriedade fractal, poderíamos sobrepor vários padrões de resolução diferente para manter o contraste da imagem estável dentro do intervalo desejado. Abaixo está o exemplo do padrão de 4 camadas (512x512 GIF). Este resultado é mais próximo do ruído browniano e também dificilmente compactável em JPEG.

Combinação de 4 camadas

MeV_2015
fonte
5

Meu palpite é que o pior padrão compressível seria o ruído branco (com distribuição uniforme). Ele precisa parecer barulhento em diferentes resoluções, para que você possa criar as imagens barulhentas no espaço de escala e depois montá-las:

I=inNiGi

Aqui é a imagem final pano, é a imagem cheia de ruído branco (diferente para cada ) e é Kernel gaussiano de tamanho . O denota convolução.N i i G i i σ INiiGiiσ

Talvez uma maneira melhor de construir essa imagem fosse trabalhar diretamente no domínio da frequência, assim:

  1. Crie uma imagem cheia de ruído branco.
  2. Execute o IDCT de bloco 8x8 (Transformada discreta inversa de cosseno) na imagem.

O resultado seria o pior padrão compressível para JPEG, pois possui maior entropia no domínio DCT. Mas não tenho certeza de como isso se comportará sob diferentes resoluções.

Libor
fonte
5

IIRC, o algoritmo de descompressão JPEG é especificado; no entanto, o algoritmo de compactação exato não é. Algoritmos diferentes podem produzir um arquivo JPEG legal. Portanto, você precisará testar isso no (s) compressor (s) de imagem escolhido (s).

Qualquer coisa pode ser compactada na mesma quantidade por um compressor com perdas, como JPEG. É que, em qualquer nível fixo de compactação, a qualidade da compactação pode variar (o ruído ou o erro no resultado descompactado aumentará) dependendo da imagem. Então você quer algo que adicione uma quantidade máxima de ruído ao resultado descomprimido. Para isso, você deseja o erro máximo para remover os coeficientes de macroblocos de alta frequência e quantificar quaisquer coeficientes.

O que provavelmente significa piquetes variados e de alta frequência, bem como escalas de cinza e cores variadas que estão entre os possíveis níveis de quantização de um determinado compressor em um determinado cenário.

Como você deseja que isso funcione a qualquer distância em qualquer iluminação, será necessário variar a frequência dos piquetes (talvez fractal, ou talvez apenas aumentada com modulação aleatória de frequência) e os níveis de cor e cinza (de maneira não coerente, por exemplo, variar o cores e níveis independentemente). A variação de matizes dependerá menos da distância, portanto, essas precisam ser escolhidas apenas para pior caso para o (s) quantizador (s) selecionado (s). O tamanho médio dos padrões de cores pode ser o dobro do tamanho dos padrões de luminância para corresponder à composição do macrobloco YUV 4: 1: 1 (área).

Eu começaria com um monte de padrões Moiré altamente coloridos em escalas muito variadas, sobrepostas e / ou remendadas fracamente.

hotpaw2
fonte
2

Deixe-me compartilhar o padrão que tem um espectro muito plano (como o ruído branco). Portanto, esse padrão é muito difícil de compactar com JPG. A imagem de amostra abaixo é ampliada 4 vezes.

O padrão em si é regular, mas não periódico, e pode ser facilmente gerado pelo algoritmo determinístico. Ele também possui uma propriedade fractal.

Padrão não periódico com espectro de ruído quase branco

Visto de longe: original longe

MeV_2015
fonte
2

O ruído aleatório realmente comprime muito mal. Você pode produzi-lo em cores gerando valores independentes de R, G, B.

Olhar à distância realmente eliminará o ruído (através da filtragem passa-baixo), e você poderá evitar isso gerando imagens de ruído em diferentes resoluções, ou seja, usando pixels cada vez maiores e superpondo-as.

Ao adicionar as imagens, você enfrenta o problema da faixa de valores, que cresce conforme o número de imagens, deixe N. Se você apenas calculá-las, a amplitude do ruído diminuirá como 1 / N.

Se você escolher ruído uniforme não correlacionado, a superposição resultará em uma distribuição quase-Gaussiana com desvio padrão de √N; portanto, em vez de dividir por N, você poderá dividir por √N (com re-centralização adequada) para limitar a redução de amplitude.

Por fim, acho que é melhor deixar os valores envolverem, em vez de saturá-los, pois valores saturados formarão grandes áreas uniformes.

Yves Daoust
fonte
2

Aqui está outra abordagem que gera ruído Browniano RGB (4096x4096 GIF). Ruído Browniano RGB

MeV_2015
fonte
0

Pergunta incrível! Em conceito, o ruído branco é um sinal que não muda quando o tempo é escalado. Da mesma forma, um fractal não muda quando é dimensionado. Um processo de compactação com perdas leva apenas o mais importante do espectro (tempo ou tamanho), não todos, então o fractal e o ruído cheiram a cookies. Portanto, você deve brincar com as cores e os padrões do seu tecido. Eles devem ser fractais e o comportamento do fractal deve ser branco gerado aleatoriamente. Você deve obter um tecido que na foto pareça preto (no espaço de cores CMY), mas no mundo real, ele tem um padrão colorido.

Boa sorte! , e se você receber a resposta, poste-a !!!.

palavras raras
fonte
"Você deve obter um tecido que na foto pareça preto" <- Nesse caso, não seria facilmente compressível?
Nicolas Raoul