Transformada de Fourier no JAI

Transformada de Fourier no JAI

por Carlos Eduardo Fernandes Zanella -
Número de respostas: 7
Estou tendo alguns problemas com a transformada de Fourier no JAI (operação "DFT" no JAI.create()).

Pelo que me lembro das aulas, ao se aplicar a transformada de Fourier discreta sobre uma imagem, o resultado é uma matriz de números complexos, cujas magnitudes formam a imagem do espectro de Fourier.

Aplicando-se a transformada inversa sobre este espectro, obtém-se novamente uma matriz de números complexos, cujas magnitudes formam a imagem original no domínio espacial.

Porém, ao aplicar isto no JAI, o resultado não deu certo. A imagem resultante era uma imagem toda em branco, com alguns pixels coloridos. Porém, quando aplico a transformada inversa na matriz de números complexos (ou seja, sem calcular a magnitude), o processo dá certo, ou seja, o resultado final é a imagem original. Minhas dúvidas então são:

* Entendi errado o conceito de transformada de Fourier e de espectro de Fourier?
* A transformada de Fourier no JAI funciona apenas com imagens quantizadas no tipo FLOAT, ou funciona para imagens em BYTE também?
* A maneira certa de usar a transformada de Fourier no JAI é não convertendo a imagem em seu espectro (a menos, claro, que se deseje visualizá-la)?
Em resposta à Carlos Eduardo Fernandes Zanella

Re: Transformada de Fourier no JAI

por Igor Ribeiro Sucupira -

Oi, Carlos.
Apesar de ainda não ter implementado nada, talvez eu possa ajudar em algumas coisas (se é que você já não se virou sozinho)...

> Pelo que me lembro das aulas, ao se aplicar a transformada
> de Fourier discreta sobre uma imagem, o resultado é uma
> matriz de números complexos, cujas magnitudes formam a
> imagem do espectro de Fourier.

A grosso modo é isso mesmo. Mas, nisso você não deve mais ter dúvidas.

> Aplicando-se a transformada inversa sobre este espectro,
> obtém-se novamente uma matriz de números complexos, cujas
> magnitudes formam a imagem original no domínio espacial.

Se você aplicou a transformada de Fourier a uma função e depois aplicou a inversa à função resultante do passo anterior, você vai obter exatamente a função original. Portanto, se a função original era uma imagem, você vai obtê-la novamente (como conseqüência, a parte imaginária será nula).
Porém, no computador as coisas não funcionam da maneira ideal, o que quer dizer que a parte imaginária vai existir após o cálculo da inversa. Neste caso, o procedimento correto é ficar apenas com a parte real, pois você conhece a função original e sabe que ela não tem parte imaginária.

> * A maneira certa de usar a transformada de Fourier no
> JAI é não convertendo a imagem em seu espectro (a
> menos, claro, que se deseje visualizá-la)?

Pelo que eu já olhei, a DFT do JAI vai só calcular a transformada (uma função complexa). Para visualizar, acho que a idéia é calcular o espectro mesmo. Mas, a gente vai precisar da função para calcular a inversa, depois.
Na verdade, não entendi o que você quer dizer com "usar".

Abraços.
Igor.
Em resposta à Igor Ribeiro Sucupira

Re: Transformada de Fourier no JAI

por Carlos Eduardo Fernandes Zanella -

Obrigado pela resposta!

Reformulando minha dúvida:

A transformada INVERSA de Fourier deve ser aplicada sobre o ESPECTRO de Fourier ou sobre a MATRIZ DE NÚMEROS COMPLEXOS? É possível obter a imagem original APENAS COM O ESPECTRO DE FOURIER?

Em termos práticos: ao calcular a transformada de Fourier de uma imagem, devo guardar o ESPECTRO de Fourier ou a MATRIZ DE NÚMEROS COMPLEXOS?

Estou realmente muito confuso quanto a isso...

Em resposta à Carlos Eduardo Fernandes Zanella

Re: Transformada de Fourier no JAI

por Igor Ribeiro Sucupira -

Infelizmente, acho (na verdade, tenho quase absoluta certeza) que o espectro não é suficiente para obter a imagem original.
O resultado da transformada de Fourier de uma função f é uma função (digamos F) complexa. Para obter a função original f, é necessário calcular a transformada inversa da função F.
Portanto, se você guardar apenas o espectro, na hora de calcular a inversa você vai precisar reconstruir cada F(u,v) utilizando apenas |F(u,v)|, o que é impossível, já que a função magnitude não é bijetora.
Em resposta à Igor Ribeiro Sucupira

Re: Transformada de Fourier no JAI

por Carlos Eduardo Fernandes Zanella -

Pois é, eu acabei chegando na mesma conclusão... o negócio é implementar guardando a imagem na forma complexa.

Minha dúvida agora é outra: como implementar as demais operações com números complexos?

* A convolução é simples, já que é uma função linear. Não tem muito o que pensar.

* A curva exponencial também não é difícil, se converter a função complexa para a forma polar.

* O problema é o logaritmo. Na forma real, a operação é log(r+1) , onde r é o nível de cinza do pixel de entrada. Mas e na forma complexa? Se fosse só log(r) , não haveria problema, bastaria novamente passar para a forma polar. Mas onde deve se somar 1?

Na forma real, soma-se 1 para não haver perigo de calcular o logaritmo de um número menor que 1, o que daria um resultado negativo. Mas e na forma complexa? É preciso somar esse 1 também?

* E a equalização? Deve ser feita na forma polar?

Estou seriamente tentado a implementar de forma que só a convolução na forma complexa seja correta... sorriso

Em resposta à Carlos Eduardo Fernandes Zanella

Re: Transformada de Fourier no JAI

por Igor Ribeiro Sucupira -

Eu implementei tudo por banda mesmo.

Quanto ao log, que problema teríamos ter?
Bem... pelo que eu calculei aqui, temos (pelo menos na minha mente doentia):
ln(a + j*b) = ln(r) + j*teta, sendo a = r*cos(teta) e b = r*sen(teta).
Ou seja: poderia dar problema só no cálculo de ln(r). Portanto, uma solução seria somar 1 em r.
Em resposta à Carlos Eduardo Fernandes Zanella

Re: Transformada de Fourier no JAI

por Carlos Hitoshi Morimoto -
Ois,
a duvida de voces me faz lembrar uma questao ate filosofica. Por exemplo,
como a gente faz para ver o gosto de uma goiaba?

Espero que a pergunta nao seja muito cabeça, pois a gente fica falando de
sinal pra ca e pra la, e esquece do que isso significa. Pois bem, nosso sinal em
geral eh alguma coisa fisica (nao vou discutir aqui os sinais metafisicos, mas se
alguem quiser pagar uma cervejinha depois sorriso, como uma goiaba.
O que a gente consegue do sinal sao medicoes (sempre com ruido), como
a imagem da goiaba no pe (cheio de bixo), seu cheiro, gosto, textura, etc.

A gente pega essas medicoes, coloca no computador, e esquece da goiaba!
A goiaba nao é so sua imagem, ou so o cheiro, ou so o gosto, etc. Pois ai a
gente pega essas medicoes no computador, e embaralha ainda mais, usando
transformadas, etc etc, e conseguimos descobrir qu o gosto da goiaba é composto
pela combinação de dezenas de moleculas básicas conhecidas. Agora vamos pegar
essas moleculas, e reconstruir a goiaba usando a transformada inversa.... por
que não da certo?

Desculpe a viagem, mas deve servir para introduzir o proximo topico da disciplina.
Voltando ao espectro de Fourier, ele NAO é a transformada do sinal, apenas a
magnitude de uma sinal complexo 2D. Por que a gente usa o espectro e nao apenas
a parte real? Apenas para facilitar a visualizacao. O espectro e' composto por numeros
reais, enquanto a transformada por complexos. Voce NAO pode ficar jogando a parte
imaginaria fora sem se comprometer depois nos calculos.

depois a gente conversa mais.
[]s
ht