Pergunta

Onde posso encontrar algoritmos para distorções de imagem? Há tantas informações de Blur e outros algoritmos clássicos, mas tão pouco mais complexos. Em particular, estou interessado no algoritmo de distorção de imagem do Swirl Effect.

Foi útil?

Solução

Não consigo encontrar nenhuma referência, mas posso dar uma idéia básica de como os efeitos da distorção funcionam.

A chave para a distorção é uma função que leva duas coordenadas (x, y) na imagem distorcida e as transforma para coordenadas (u, v) na imagem original. Isso especifica a função inversa da distorção, pois leva a imagem distorcida de volta à imagem original

Para gerar a imagem distorcida, um loop sobre X e Y calcula o ponto (u, v) de (x, y) usando a função de distorção inversa e define os componentes de cores em (x, y) como o mesmo que aqueles em (u, v) na imagem original. Um usa usualmente a interpolação (por exemplo http://en.wikipedia.org/wiki/bilinear_interpolation ) determinar a cor em (u, v), pois (u, v) geralmente não fica exatamente no centro de um pixel, mas em algum ponto fracionário entre os pixels.

Um redemoinho é essencialmente uma rotação, onde o ângulo de rotação depende da distância do centro da imagem. Um exemplo seria:

a = amount of rotation
b = size of effect

angle = a*exp(-(x*x+y*y)/(b*b))
u = cos(angle)*x + sin(angle)*y
v = -sin(angle)*x + cos(angle)*y

Aqui, presumo que o centro do redemoinho esteja em (0,0). O redemoinho pode ser colocado em qualquer lugar subtraindo as coordenadas da posição do redemoinho de x e y antes da função de distorção e adicionando -as a u e v atrás dela.

Existem vários efeitos de redemoinho: alguns (como o acima) giram apenas uma área localizada e têm a quantidade de redemoinho diminuindo em direção à borda da imagem. Outros aumentam o giro em direção à borda da imagem. Esse tipo de coisa pode ser feito tocando com o ângulo = linha, por exemplo

angle = a*(x*x+y*y)

Outras dicas

Há uma implementação de Java de muitos filtros/efeitos de imagem em Filtros de imagem Java de Jerry. Talvez você possa se inspirar a partir daí.

O redemoinho e outros como são uma transformação de matriz nos locais de pixels. Você faz uma nova imagem e obtém a cor de uma posição na imagem que obtém da multiplicar a posição atual por uma matriz.

A matriz depende da posição atual.

Aqui está um bom projeto de código mostrando como fazer isso

http://www.codeproject.com/kb/gdi-plus/displacementfilters.aspx

tem uma nova biblioteca gráfica tem muitos recursos

http://code.google.com/p/psasso-graphic/

Dar uma olhada em Imagemagick. É um kit de ferramentas de conversão de imagem e edição e possui interfaces para todos os idiomas populares.

O operador -displace pode criar redemoinhos com o mapa de deslocamento correto.

Se você estiver por algum motivo, não está satisfeito com a interface ImageMagick, sempre pode dar uma olhada no código -fonte dos filtros e ir a partir daí.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top