Videos e Cores 2

Continuando a postagem anterior me lembrei que há um anime com uma cena criada justamente para testar cores: em Kizumonogatari III Reiketsu-hen há uma cena que aparece o padrão de testes da SMPTE, em especial, o padrão SMPTE RP 219:2002 criado para testar o sinal de imagens HDTV. Esse padrão é interessante pois ele permite identificar várias características das imagens, em especial, as que foram mostradas na postagem anterior.

E o assunto da postagem de hoje vai ser comparar o encode de quatro grupos usando essa imagem como referência! Esse anime foi bem popular, hein?!

Bem, não vou falar o nome dos quatro grupos porque não estou com vontade de fazer propaganda de nenhum grupo. Se quiserem saber só pesquisar na internet. Vou chamar os grupos de A, B, C e D. Tirei uma captura de tela do frame em questão de cada vídeo usando o ffmpeg configurado no modo PNG em 32 bits. Aqui está uma tabela para facilitar:

# Tamanho do vídeo Tamanho da imagem Dimensões
A 986 MiB 475 KiB 1280×720
B 1,32 GiB 395 KiB 1920×816
C 1,29 GiB 203 KiB 1920×816
D 2,13 GiB 176 KiB 1920×1080

Para mais informações sobre os vídeos publiquei o resultado do MediaInfo de cada um dos arquivos nesse gist.

Como podem notar eu organizei os arquivos com base no tamanho da imagem, isso porque considerei que o PNG seria maior quanto mais informações ele tivesse para armazenar e ter mais informações é um indício forte de qualidade.

Notem que a imagem maior é, surpreendentemente, da fonte com a menor resolução e o menor tamanho do arquivo. Parece estranho? Não é: provavelmente o grupo A é o que menos modificou o conteúdo do vídeo, possibilitando que ele pudesse ser melhor comprimido como vídeo sem perder informações. Por outro lado o grupo D é o grupo que mais perdeu informações, ainda que o tamanho do vídeo seja tão grande. Isso ocorreu porque o grupo usou o nojento hardsub e, assim, precisou diminuir a qualidade do vídeo.

Claro, uma comparação de encode sem imagens não faz sentido, então aqui está as imagens dos grupos, de A até D:

Novamente, assim como na postagem anterior, é mais fácil comparar as imagens abrindo elas em guias separadas e trocando uma pela outra para facilitar a comparação.

Vamos começar a análise das imagens pelo ponto favorito que o pessoal gosta de ficar reclamando: banding. É fácil de notar que o gradiente nesse padrão de testes foi criado justamente para testar isso.

  • O grupo A apresenta pouco banding pois no gradiente há um dithering que reduz esse efeito. Esse dithering provavelmente foi o que fez com que o tamanho da imagem aumentasse tanto. Mesmo assim o efeito não foi completamente eliminado.
  • O grupo B foi o único que usou 10 bit e por isso é o que menos apresenta banding. Por outro lado como poucos programas suportam PNGs de 32 bit (e o imgur com certeza não suporta) provavelmente no seu navegador a imagem esse grupo apresenta mais banding que o grupo A.
  • O grupo C também apresenta um banding mais forte que os grupos A e B, mas não tão forte quanto o do grupo D.

Apesar da popularidade esse ponto para mim não é tão importante já que minha tela é limitada a 8 bits por canal mesmo. Como podemos ver acima caso um programa não suporta 10 bit, ou caso esteja mal configurado, é possível que uma imagem em 10 bit tenha mais banding que uma em 8 bit com dithering.

Agora vamos falar de um ponto mais importante: as cores. O verde dos grupos A e D é mais forte, em torno de #1EFF0B em RGB, já nos grupos B e C o verde fica em torno de #0EDF03. O esperado seria algo como #00BF00. Provavelmente os grupos A e D cometeram o erro de configurar a imagem usando a matriz 601, um padrão mais antigo, quando deveria ser 701. Provavelmente esses grupos usam configurações de encode antigas e não dão a mínima importância em se atualizar e usar padrões mais novos.

Finalmente vamos testar a intensidade das cores. Os valores estão no mesmo formato antigo usado em CSS, isso é RGB 8 bit em hexadecimal:

  • Valores esperados: preto é #000000, 4% de cinza é #0A0A0A, 15% de cinza é #262626, 40% de cinza é #666666, 75% de cinza é #C0C0C0 e branco é #FFFFFF;
  • Grupo A: preto é #000000, 4% de cinza é #000000, 15% de cinza é #262626, 40% de cinza é #666666, 75% de cinza é #BDBDBD e branco é #FEFEFE;
  • Grupo B: preto é #010101, 4% de cinza é #010101, 15% de cinza é #262626, 40% de cinza é #666666, 75% de cinza é #BEBEBE e branco é #FFFFFF;
  • Grupo C: preto é #000000, 4% de cinza é #000000, 15% de cinza é #252525, 40% de cinza é #656565, 75% de cinza é #BDBDBD e branco é #FEFEFE;
  • Grupo D: preto é #000000, 4% de cinza é #000000, 15% de cinza é #252525, 40% de cinza é #656565, 75% de cinza é #BDBDBD e branco é #FDFDFD;

Provavelmente o 4% de cinza não apareceu pois a produção do anime deve ter esquecido de colocar ele na imagem. Ou todo mundo errou o encode! Apesar disso parece que nenhum dos grupos teve problemas para configurar os níveis do vídeo.

No fim das contas para mim o grupo B é o que se saiu melhor, não apenas porque usou 10 bit evitando o problema de banding mas também porque não errou a configuração de cor. Eu pedi para a Crunchyroll traduzir esse anime: se eles fizerem isso vou repetir o teste com eles.

E é só isso por hoje. Se vocês tiverem dúvidas e comentários deixe eles abaixo. Se gostou desta postagem acompanhe o bug. E tenha um bom dia!