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) # verticalmentecn <- (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








Re: Redimensionamento simples de imagem e outras transformações
Pois é, a imagem de entrada você já tem. É natural pensar que o processo se dará no sentido da construção da nova imagem.
E quase tudo nessa área é assim: impressionante, mas tranquilo se for bem abordado. É uma área realmente muito bonita.
Re: Redimensionamento simples de imagem e outras transformações
Isso é apenas pseudocódigo.
É melhor começar a programar apenas quando os algoritmos já estiverem bem concebidos.
Tarefas que extraviam informação (como passar para preto e branco - imagem binária -, por exemplo) precisam de um critério para definir qual informação será mantida e qual será extraviada (como limiarização, por exemplo).
É imprescindível abordar o problema formalmente.
Esse assunto é interessante, mas note que não é possível "vetorizar" uma imagem, ou seja, é necessário definir bem o problema antes. Você pode estar interessado em transformar uma imagem (que é uma função discreta) em outro objeto, como um conjunto de funções de determinado tipo (bézier, splines etc.), ou uma superposição de polígonos, ou uma representação tridimensional, ou qualquer outro objeto. Mas, antes de começar, é preciso definir o que se quer exatamente (matematicamente).
Seria legal continuar a escrever pequenos textos sobre isso (definição clara do problema e discussão da solução) no contexto de processamento de imagem e, quem sabe, visão computacional. Havendo tempo, tudo é possível. O importante é discutir o fundamento; o resto é consequência.
Re: Redimensionamento simples de imagem e outras transformações
eu estava com uma dúvida quanto a isso há algum tempo, pois a matriz de rotação emprega senos e cossenos, que resultariam em produtos reais; os pixels, porém, possuem coordenadas geralmente inteiras. Eu não entendia como a imagem era reconstruída.
só quando eu googlei um pouco foi que eu vi esse link:
http://polymathprogrammer.com/2008/10/06/image-rotation-with-bilinear-interpolation/
a solução, afinal, era bem simples. Ao invés de rotacionar os pixels da fonte, ele rotacionava os pixels do destino e descobria em qual lugar da fonte iria estar. Juntando com a técnica da interpolação bilinear ou alguma mais avancada, o resultado é realmente impressionante.
E eu pensando em várias formas super complicadas, como subdividir o pixel e fazer a tranformação nessas partes menores
Re: Redimensionamento simples de imagem e outras transformações
Muito interessante o seu artigo.
Que linguagem de programação é essa?
Há muitos anos atrás eu tentei escrever vetorizador de imagens (transformar bitmaps em desenhos vetoriais) em C++, na época eu usava o C++ Builder da Borland.
Eu tinha que transformar a imagem em tons de cinza e depois em preto e branco e então trabalhar com os pixels individuais. Fiquei quase louco, desisti da idéia depois de conseguir fazer um programinha que funcionava mais ou menos.
Se você tiver um tempo que tal escrever sobre vetorizadores de imagem, como aqueles encontrados no Corel Draw ou no Adobe Illustrator?