Para discutir aspectos básicos do processo de redimensionamento, é interessante tomar a imagem como uma matriz X de tamanho m' por n', sendo que tal processo consiste em obter outra matriz Y com tamanho m por n a partir da primeira.
Também é possível interpretar a imagem como sendo uma função de suas coordenadas: ao mudarmos a resolução da imagem, estamos mudando, essencialmente, o número de pontos em uma ou outra dimensão e, como a nova imagem redimensionada deve ser a menos alterada possível, podemos realizar uma interpolação para determinar os pontos que irão constituir a nova função discreta.
Assim, uma imagem pode ser tida como uma matriz ou, de maneira análoga e intercambiável, como uma função discreta de suas coordenadas. Para imagens coloridas, basta tratar cada canal separadamente.
I: D C NxN -> N (D estritamente contido em NxN, em que N é o conjunto dos naturais)
(i,j) |-> I(i,j)
Note que o domínio D é sempre finito e que a imagem (da função) é obviamente finita e interpretada como um conjunto de intensidades luminosas, apresentanto um mínimo e um máximo.
Os algoritmos de redimensionamento variam quanto à forma de interpolação utilizada ao longo de um percorrimento sequencial dos pontos da matriz Y a ser gerada. O objetivo é determinar o valor de cada ponto interpolando a pequena (e limitada) vizinhança que lhe é correspondente na imagem de entrada.
Usando a interpolação trivial com base no ponto mais próximo, o algoritmo é o seguinte:
# coeficiente para mudança de escala de Y para X:
cm <- (m'-1)/(m-1) # verticalmente
cn <- (n'-1)/(n-1) # horizontalmente
para i de 0 a m-1
para j de 0 a n-1
# mapeamento do par (i,j) em Y para (i',j') em X
i' <- round(i*cm) # escala e arredondamento (de i para i')
j' <- round(j*cn) # escala e arredondamento (de j para j')
Y(i,j) <- X(i',j')
fim
fim
Note que, no algoritmo acima, o valor de cada ponto atribuído à nova imagem Y é exatamente o valor do ponto mais próximo em X, depois de feito o mapeamento das coordenadas.
Outra forma bastante comum (um pouco mais elaborada, mas ainda bastante elementar e eficiente) é a interpolação bilinear, em que o valor de cada ponto atribuído à nova imagem Y é a média dos quatro pontos mais próximos ponderada pela distância relativa ao ponto mapeado. Esse é o caso mais simples de modo a evitar o aspecto pixelado, comum no caso de ampliação com interpolação com base no ponto mais próximo.
Imagem original:

Imagem ampliada (metade esq. via ponto mais próximo; metade dir. via bilinear):

Quanto mais elaborada for a interpolação utilizada (como bilinear, bicúbica, etc.), mais tempo levará para cada ponto ser calculado. Entretanto, se o tamanho da janela (vizinhança) tomada para interpolação for limitado, a complexidade assintótica temporal do algoritmo de redimensionamento é claramente linear em relação ao número de pontos, isto é, O(mn), o que é bastante desejável.
O redimensionamento (mudança de escala) é apenas um caso particular de transformação linear sobre as coordenadas da imagem. O que foi estabelecido acima vale se forem utilizados outros tipos de transformação linear, como rotação, por exemplo. O processo é feito de maneira análoga: para cada ponto da imagem gerada Y, mapeia-se sua coordenada para a imagem de entrada X (desta vez fazendo uso da transformação desejada) e aplica-se uma interpolação para calcular o valor no ponto.
Obs.: É importante não confundir a possível complexidade linear do algoritmo com o fato de que ele emprega uma transformação linear; uma coisa não tem a ver com a outra.
Fonte: Cambridge in Colour
Comentários recentes
2 horas 27 minutos atrás
18 horas 47 minutos atrás
20 horas 51 minutos atrás
1 dia 20 horas atrás
1 dia 22 horas atrás
2 dias 2 horas atrás
2 dias 2 horas atrás
2 dias 10 horas atrás
2 dias 14 horas atrás
2 dias 15 horas atrás