A cor é uma diferença notável entre os filmes da Marvel e da DC. Enquanto a Disney/Marvel Studios costuma lançar filmes com tons mais claros e alegres, a Warner tem optado por cenários escuros, com um aspecto mais sombrios. Essas escolhas são um reflexo do clima das histórias de cada universo: aventuras engraçaralhas com um drama superficial vs seja lá o que passa na cabeça do Zack Snyder.
Para estudar melhor a paleta de cores utilizadas nos filmes, vamos aplicar a análise introduzida pelo Dani neste post, com pequenas alterações. Como amostra, selecionei 10 imagens de Batman vs Superman e 10 do Capitão América: guerra civil. Tentando deixar a análise o menos subjetiva possível, escolhi imagens de cenas emblemáticas e dos principais personagens. Abaixo as imagens que peguei de cada filme.
Seguindo a análise do Dani, vamos utilizar as seguintes bibliotecas para a análise.
library(jpeg)
library(tidyverse)
library(glue)
Eu salvei as imagens em arquivos do tipo “bvs_n.jpg” e “cw_n.jpg”, com n variando de 1 a 10. Isso facilitou a leitura desses arquivos. O código abaixo mostra como criar um vetor com o caminho das 10 imagens de cada filme. Se você quiser saber mais sobre a função glue()
, visite este post.
arquivos_bvs <- glue("images/bvs_{n}.jpg", n = 1:10)
arquivos_cw <- glue("images/cw_{n}.jpg", n = 1:10)
Como vamos trabalhar com mais de uma imagem, eu criei a função ler_imagem()
para ler os arquivos.
ler_imagem <- function(caminho) {
img <- readJPEG(caminho) %>%
apply(3, as.numeric)
}
Podemos então usar a função map()
para aplicá-la a todos os 10 arquivos. A função reduce(rbind)
transforma as 10 matrizes de pixels em uma matriz só, como se as imagens estivessem coladas uma embaixo da outra.
img_bvs <- map(arquivos_bvs, ler_imagem) %>% reduce(rbind)
img_cw <- map(arquivos_cw, ler_imagem) %>% reduce(rbind)
Abaixo estão as funções cria_paleta()
e exibir()
do post do Dani. A única diferença aqui é que a função cria_paleta()
já recebe a matriz representando a imagem.
criar_paleta <- function(img_matrix, num_cores){
km <- kmeans(img_matrix, centers = num_cores)
img_df <- tibble(
r = img_matrix[,1],
g = img_matrix[,2],
b = img_matrix[,3],
cluster = km$cluster
)
centroides <- img_df %>%
group_by(cluster) %>%
summarise_all(mean)
centroides <- centroides %>%
mutate(cor = rgb(r, g, b))
sort(centroides$cor)
}
exibir <- function(x) {
n <- length(x)
old <- par(mar = c(0.5, 0.5, 0.5, 0.5))
on.exit(par(old))
image(1:n, 1, as.matrix(1:n), col = x,
ylab = "", xaxt = "n", yaxt = "n", bty = "n")
}
Assim, basta aplicar essas funções aos objetos img_bvs
e img_cw
para obter as paletas. Primeiro para o Batman vs Superman:
paleta_bvs <- criar_paleta(img_bvs, 10)
exibir(paleta_bvs)
E agora para o Capitão América:
paleta_cw <- criar_paleta(img_cw, 10)
exibir(paleta_cw)
Observe que o filme da DC tem cores mais escuras e fortes, com vários tons de azul, indicando as cenas noturnas e de chuva. Já a paleta da Marvel apresenta cores mais claras, com vários tons representando o céu pálido das cenas externas.
Podemos fazer a análise agora para o pôster de cada filme (o que aparece no IMDB):
img_bvs <- ler_imagem("images/bvs_poster.jpg")
paleta_bvs <- criar_paleta(img_bvs, 10)
exibir(paleta_bvs)
img_cw <- ler_imagem("images/cw_poster.jpg")
paleta_cw <- criar_paleta(img_cw, 10)
exibir(paleta_cw)
Veja que os diferentes tons de azul se repete no pôster do Batman vs Superman. Já o pôster do Capitão América é bem cinzento, com metade da paleta representando tons de cinza.
Fica então o desafio de repetir a análise para outros filmes e compartilhar o resultado com a gente. Comentários? Sugestões? Críticas? Mande a sua opinião!