Software Para Processamento Digital de Sinais/Imagens |
Qua, 30 de Setembro de 2009 13:26 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Este software foi desenvolvido como parte de uma atividade da disciplina de Processamento Digital de Imagens, o qual teve como objetivo implementar uma grande variedade de mascaras para sinais digitais. O relatório descreve os métodos detalhadamente e pode ser usado como referencia por quem deseja trabalhar com processamento de imagens/sinais digitais.
A aplicação de filtros em imagens digitais tem grande utilidade em diversas áreas de ciência, com destaque principalmente em sistemas clínicos, onde normalmente é usado na remoção de ruídos indesejáveis, possibilidade obter sinais de melhor qualidade a fim de serem analisados mais precisamente por profissionais ou sistemas de Visão Computacional. Clique em leia mais para ver o relatório completo e o software.
Introdução ao Processamento Digital de Imagens
Equipe: Álan Livio V.Gudes Danilo Assis João F. M. Figueiredo – Este endereço de e-mail está protegido contra SpamBots. Você precisa ter o JavaScript habilitado para vê-lo.
Antes de prosseguir com o relatório, segue abaixo o tópico que ilustra as capturas de tela do software desenvolvido.
Anexo A
Para validação dos filtros, desenvolveu-se um software na linguagem de programação Java que os implementa, permitindo que sejam re alizadas comparações entre às imagens de entrada e o resultado da aplicação das operações abordadas neste relatório. Abaixo seguem capturas de telas que ilustram o software:
1. Introdução
O Processamento digital de imagens tem sido largamente utilizado em aplicações na vida moderna. Sua utilização vai de simples fotos caseiras às técnicas de diagnóstico para medicina ou satélites. Este tratamento de sinais digitais consiste em melhorar ou recuperar determinadas características de uma imagem de forma a permitir ou facilitar o seu reconhecimento pelo ser humano ou por uma máquina. A figura 1 ilustra a relação desta área com demais áreas relacionadas, como a visão computacional e a computação gráfica.
Figura 1 PDI e áreas correlatas O estudo do processamento digital de imagens foca-se em imagens digitais, que consistem em um arranjo bidimensional de valores (sinais 2D) representando as características luminosas de uma cena. Cada valor deste é conhecido como pixel (picture element).
1.1 Sistemas de Cor
Existe uma diversidade de sistemas de representação de cores, mas, neste trabalho, serão adotados apenas dois. Um é o sistema padrão de representação de cores em imagens digitais, chamado de RGB (Red, Green and Blue). Esse modelo é usado pela maioria dos dispositivos de aquisição e visualização de imagens, podendo ser visto como um cubo de cores onde as componentes vermelha, verde e azul correspondem aos eixos x, y e z. Os tons de cinza ocorrem quando as três componentes possuem valores iguais, seguindo a diagonal principal do cubo, com a origem (0,0,0), preta, e a extremidade inversa (255,255,255), branca. O cubo que representa o modelo RGB está ilustrado na figura 1:
Figura 2 Sistema RGB O sistema YUV é atualmente utilizado em transmissão de TV em cores pelos padrões PAL e NTSC, dentre outros, e também preserva compatibilidade com os padrões de TV P & B. No sistema YUV, o Y representa a componente de luminância (intensidade percebida, ou brilho), enquanto que o componente U e Q representam a crominância. A conversão do sistema RGB para YUV é dada por:
1.2 Objetivos do Trabalho
A proposta desde trabalho é implementar a seguintes operações para processamento digital de imagens, utilizando o ambiente MatLab e outra linguagem de programação, que aqui, definiu-se a linguagem Java.
a) Conversão RGB-YUV-RGB b) Exibição de bandas individuais (R, G e B) como imagens monocromáticas b) ou coloridas (em tons de R, G ou B, respectivamente) c) Negativo d) Controle de brilho aditivo e) Controle de brilho multiplicativo f) Filtros de média e mediana de ordem n x n g) Filtro do desvio-padrão h) Dissolver cruzado duas imagens de dimensões idênticas.
a) Um ruído qualquer em Java b) Os ruídos salt & pepper', gaussian e speckle em MATLAB.
Sendo as operações de 3 à 6 feitas diretamente sobre os valores R, G e B de cada pixel e, em diante, após a transformação, elas serão aplicadas sobre o valor de intensidade (Y) de cada pixel no sistema YUV, devendo a imagem, ao final do processamento, retornar para o sistema RGB. As imagens finais, resultantes da aplicação das operações sobre as iniciais, deverão ser exibidas de maneira que se possa fazer um comparativo entre ambas e, assim, perceber o efeito causado pela aplicação da função sobre a imagem. Estas funções, bem como suas aplicações, serão apresentadas nas seções subseqüentes.
2. Materiais e Métodos
2.1 Detalhes de linguagem
Em MATLAB as imagens são representadas como três matrizes de inteiros, que correspondem às três bandas de cores. Tal representação é de uso comum na linguagem e possui fácil manipulação e acesso via operadores da linguagem. Em Java as imagens são representadas por objetos da classe BufferedImage, do pacote java.awt.image. Estas são tratadas como uma matriz de inteiros de quatro bytes, sendo três bytes usados para representar as bandas R, G e B, que podem ser separadas de acordo com o exemplo abaixo:
int pixel = imagem.getRGB(linha, coluna); int bandaR = (pixel >> 16) & 255; int bandaG = (pixel >> 8) & 255; int bandaB = (pixel >> 0) & 255;.
2.2 Metodologia de implementação dos filtros
2.2.1 Transformação RGB YUV
Para esta operação foi utilizado o sistema linear apresentado na introdução:
Onde; R, G e B são os valores de cada pixel, Y’= [0,1], U=[-0.436,0.436] e U=[-0.615,0.615].
2.2.2 Transformação YUV RGB
Para esta operação foi utilizado o sistema linear apresentado na introdução: onde Y, U e V são os valores de cada pixel.
2.2.3 Negativo para RGB e YUV
A operação negativo nas bandas R, G e B de uma imagem consiste em inverter as suas cores, provocando alterações intensas de matizes, com a substituição das cores por suas complementares (verde/magenta, azul/amarelo, vermelho/cíano, branco/preto). A simples operação do negativo às vezes permite a observação de forma mais clara de algumas estruturas da imagem. Ela se dá da seguinte forma:
Já para o formato YUV, a subtração é realizada apenas na banda Y. As alterações são feitas apenas nas intensidades das cores como, por exemplo, de vermelho escuro para vermelho claro ou vice e versa:
Se fizer-se, após a aplicação do negativo na banda Y, uma conversão para o sistema RGB original, as matizes serão perfeitamente preservadas.
Brilho Aditivo e Multiplicativo para RGB e YUV
Aumentar o brilho de uma imagem consiste em incrementar a intensidade luminosa de cada pixel. Para uma imagem no sistema RGB, aumenta-se um valor constante em cada banda R, G ou B, somando (efeito aditivo) ou multiplicando (efeito multiplicativo) a uma constante c, ou seja:
Para uma imagem no sistema YUV é utilizada a mesma idéia, sendo que a operação só é realizada para a banda Y, ou seja:
Essa operação requer que alguns limites sejam analisados, pois os valores de cada banda variam entre 0 e 255 e não podem ultrapassar estes.
Separar bandas R, G e B em imagens monocromáticas e coloridas.
As imagens usadas estão representadas no formato RGB, sendo assim constituídas da superposição de três bandas, cada qual com uma tonalidade de R, G e B, respectivamente. A separação destas bandas é alcançada pela captura do pixel que, na representação em tipo Integer da linguagem Java, possui 4bytes, sendo o primeiro byte reservado para transparência e os 3 bytes seguintes para as bandas RGB. Uma vez capturado o pixel, faz-se um deslocamento dos bytes(16, 8 ou 0 bits para R, G e B, respecticamente) e uma operação lógica E com a mascara 255. O resultado desta operação retornará a contribuição daquela banda para o pixel. Um exemplo pode ser visto abaixo:
Separação das bandas R, G e B de um pixel, usando linguagem Java: int bandaR = (pixel >> 16) & 255; int bandaG = (pixel >> 8) & 255; int bandaB = (pixel) & 255;
Uma vez separado o pixel nas três bandas, pode-se fazer o processo de deslocamento inverso para atribuí-las de volta ao pixel original. É nesta etapa que faz-se a separação, atrinbuindo de volta ao pixel apenas a contribuição de uma das bandas e zerando o valor das demais, conforme exemplo abaixo:
Atribuição apenas da banda R a um pixel, usando linguagem Java: pixel = (bandaR << 16) | 0 | 0;
Por fim, atribui-se o pixel de volta a imagem, obtendo uma imagem formada pela contribuição de apenas uma banda e com as demais “zeradas”, causando um efeito avermelhado, verde ou azulado, conforme a banda escolhida. Para fazer a separação em imagem monocromática, faz-se o mesmo procedimento anterior, porém, ao atribuir o valor da banda de volta ao pixel, atribui-se este valor aos três bytes, conforme exemplo abaixo: Atribuição apenas da banda R a um pixel, como imagem monocromática, usando linguagem Java: pixel = (bandaR << 16) | (bandaR << 8) | bandaR;
O processo é análogo para as demais bandas.
Média para RGB e YUV
O valor do pixel resultante é igual média dos valores dos pixels originais em uma vizinhança n x n.
Este é um filtro simples e usado freqüentemente para suavizar imagens, com conseqüente redução de alguns ruídos. Sua operação sobre um pixel é a média aritmética desde pixel e sua vizinhança, que pode variar como uma seqüência de números imparem, como 3x3, 5x5, 11x11 e etc. A tabela abaixo ilustra esta operação:
Na tabela acima, para calcular-se a média do pixel A, em uma vizinhança 3x3, deve-se efetuar a média aritmética dos pixels marcados como P com o pixel A, ou seja: Média em A = P+P+P+P+P+P+P+P+A / 9. O valor resultante é, por fim, atribuído ao pixel A e o processo continua com o próximo pixel. Para uma vizinhança maior, o processo é análogo, conforme visto para o pixel B em vizinhança 5x5. Ressalta-se que quanto maior for a vizinhança, maior a percepção do feito e, também, o tempo requerido para o processamento. Detalhes de implementação em linguagem Java podem ser encontrados nos anexos.
Mediana para RGB e YUV
A operação de mediana é, assim como a média, freqüentemente utilizada para remoção de ruídos, neste caso, principalmente ruído do tipo aleatório, além de causar um efeito de “desenho” na imagem final. Sua implementação consiste em ordenar o pixel e sua vizinhança em um vetor e encontrar o elemento central, ou seja, o elemento mediano. A tabela abaixo ilustra este processo:
Para calcular a mediana do pixel 6, ordena-se sua vizinhança em um vetor e substitui-se o pixel 6 pelo pixel encontrado no meio do vetor, ou seja, vetor[length/2], onde length é o tamanho do vetor, como a seguir: Vetor = { 1, 3, 4, 5, 5, 6, 7, 8, 9 }; Vetor[length/2] = 5; Assim, o valor final do pixel 6 será 5, sua mediana. O processo é análogo para vizinhança maior e continua até varrer todos os pixels da imagem.
Desvio-padrão para RGB e YUV
O desvio padrão é uma operação realizada em um conjunto de valores, que neste caso, será aplicado sobre um vetor contendo a vizinhança do pixel. Neste trabalho, utilizou-se dois tipos de desvio padrão; o estimado e o calculado, que serão exemplificados a seguir. Desvio padrão estimado: Neste desvio padrão, deve-se calcular a amplitude média do processo, que é dada pela razão da soma das amplitudes médias dos subgrupos pela quantidade de subgrupos, que neste caso, resume-se a um, ou seja, uma vizinhança. A amplitude da vizinhança é calculada pela diferença entre o maior e o menor valor das amostras. Uma vez calculada a amplitude, deve-se realizar a razão desta com um fator correspondente ao número de amostras, dada pela tabela a seguir:
Sendo assim, o desvio padrão estimado é dado por:
Onde R é a amplitude das amostras.
Desvio padrão calculado: Este desvio padrão normalmente é aplicado em valores individuai. Para seu calculo, deve-se calcular a média do processo, que é a média das médias dos subgrupos. Ou seja, soma-se os pixels de uma vizinhança e calcula-se sua média, que deverá ser somada às demais médias dos demais subgrupos e dividida pela quantidade total de subgrupos. Por fim, faz-se o quadrado da diferença de cada amostra pela média do processo, soma-se todos esses valores e divide-se pelo numero total de amostras menos 1. O resultado será a variância, que ao ter sua raiz quadrada calculada, dará o desvio padrão calculado daquele pixel. Abaixo segue a formula:
Onde: Xi é cada amostra em uma vizinhança X é a média do processo, dado pela média das médias dos subgrupos. n é a quantidade total de amostras
Para aplicação do desvio padrão em uma imagem, deve-se efetuar um dos cálculos acima para cada um dos pixels, substituindo-o pelo resultado da operação. Neste trabalho, ambas as formulas citadas acima foram implementadas na linguagem Java e estão disponiveis nos anexos, as quais resultam em uma imagem escurecida, como se houvesse sido capturada em um ambiente pouco iluminado. Porém, o efeito solicitado, na verdade, foi de uma imagem final quase totalmente escura, com apenas alguns riscos brancos nos locais das bordas. Para alcançar este efeito, outro algoritmo foi estudado e implementado, o qual se alcançou através de uma variação do calculo do desvio padrão estimado. A implementação final encontra-se, também, junto aos anexos, e consiste em capturar os pixels mais e menos relevantes do final do vetor com as amostras de uma vizinhança e, por fim, realizar a razão da diferença destes pixels por 2, ou seja:
(ultimoPixelDeMaiorValor – ultimoPixelDeMenorValor) / 2.
Ressalta-se que o objetivo desde trabalho é a manipulação de imagens digitalmente, através da implementação de operações que hão de trabalhar sobres as mesmas e que, dado um determinado filtro, em forma de algoritmo, sua implementação e aplicação faz parte deste objetivo, e não a medição da “afeição” com ferramentas de buscas, que certamente estão fora deste escopo. Em suma, se o filtro correto do desvio padrão não foi especificado, não é tarefa dos autores tentarem “adivinhá-lo”.
Dissolve cruzado em RGB
Cada pixel gi da imagem é dado por gi = (f1i + f2i)/2, onde f1 e f2 são imagens de dimensões idênticas. 3. Resultados
Os resultados obtidos para cada objetivo são mostrados abaixo:
1. Funcionalidades do sistema
a) Conversão RGB-YUV e YUV RGB
Percebe-se que a imagem em YUV aparece em vermelho, pois a banda Y é representada pela banda vermelha.
Figura 3 Imagem Original Figura 4 Imagem YUV Figura 5 recuperação da original
b) Exibição de bandas individuais (R, G e B) como imagens monocromáticas ou coloridas
Figura 6 Banda R Figura 7 Banda G Figura 8 Banda B
c) Negativo
O negativo aplicado em RGB altera as cores da imagem, uma vez que é aplicado a cada banda. Enquanto que no YUV, apenas o brilho sofre variação, que corresponde a banda Y, luminancia.
Aplicado em RGB
Figura 9 Imagem Original Figura 10 negativo RGB
Aplicado em YUV e convertido para RGB
Figura 11 Imagem Original Figura 12 negativo YUV
d) Brilho Aditivo
A adição de brilho em YUV é mais intensa, uma vez que o brilho é incrementado diretamente na luminancia da imagem. . Aplicado em RGB(c=50)
Figura 13 Imagem Original Figura 14 aditivo 50 RGB
Aplicado YUV e convertido para RGB(c=50)
Figura 15 Imagem Original Figura 16 aditivo 50 YUV
e) Brilho Multilicativo
Semelhante ao brilho aditivo, porém mais intenso.
Aplicado em RGB(c=2):
Figura 17 Imagem Original Figura 18 multiplicativo 2 RGB
Aplicado YUV e convertido para RGB(c=2):
Figura 19 Imagem Original Figura 20 multiplicativo 2 YUV f) Media e Mediana
Media Aplicado em RGB(n=10):
Figura 21 Imagem Original Figura 22 media n=10 RGB
Media Aplicado YUV e convertido para RGB(c=10):
Figura 23 Imagem Original Figura 24 media n=10 YUV
Mediana Aplicado em RGB(n=7):
Figura 25 Imagem Original Figura 26 mediana n=7 RGB
Mediana Aplicado YUV e convertido para RGB(n=7):
Figura 27 Imagem Original Figura 28 mediana n=7 YUV g) Desvio Padrão
Aplicado em RGB (n=3):
Figura 29 Imagem Original Figura 30 desvio padrão n=3 RGB
h) Dissolve Cruzado
Este filtro realiza uma sobre posição das duas imagens.
Figura 31 Imagem I Figura 32 Imagem II
Figura 33 Soma de da imagens I e II
2. Aplicação e remoção ruído
a) Adição de ruído e tentativa de eliminação do mesmo utilizando os filtros da média e mediana em Java
O ruído é gerado a partir de uma densidade escolhida pelo usuário, a qual representa uma porcentagem da imagem que terá ruído. Abaixo, a primeira figura ilustra a imagem escolhida para aplicação da poluição e, posteriormente, a filtragem dessa pela média e mediana. A segunda figura ilustra a original após a adição de 10 % de ruído.
Figura 34 - Imagem original Figura 35 - Imagem com ruído
As figuras a seguir demonstram, respectivamente, a aplicação do filtro da média e da mediana numa vizinhança 3x3 na figura original.
Figura 36 - Imagem após o uso do filtro da média Figura 4 – Imagem após o uso do filtro da mediana
Percebeu-se que, para o método implementado de ruído aleatório, apenas o filtro da mediana se mostrou eficiente na remoção deste ruído.
b) Adição de ruído e tentativa de eliminação do mesmo utilizando os filtros da média e mediana em Java
Uma imagem foi escolhida para ser aplicado os ruídos salt & pepper, gaussian e speckle. Também foi escolhido um valor para a densidade de ruído que foi 0.02. O script abaixo demonstra a aplicação do ruído salt & pepper e, posteriormente, o uso do filtro da média na banda R, G e B da imagem que fora anteriormente selecionada. Foi escolhida uma densidade de ruído de 0,02. Na aplicação dos filtros da média e mediana foi decidido que os testes seriam feitos para uma vizinhança 3x3.
a = imread('13.jpg'); imshow(a); b = imnoise(a,'salt & pepper',0.02); figure,imshow(b); c = filter2(fspecial('average',3),b(:,:,1))/255; figure,imshow(c); d = filter2(fspecial('average',3),b(:,:,2))/255; figure,imshow(d); e = filter2(fspecial('average',3),b(:,:,3))/255; figure,imshow(e); imagem_apos_media(:,:,1) = c; imagem_apos_media(:,:,2) = d; imagem_apos_media(:,:,3) = e; figure,imshow(imagem_apos_media);
Logo abaixo, a Figura 37 ilustra a imagem original selecionada para a aplicação dos ruídos do tipo salt&pepper, gaussian e speckle e, posteriormente, a aplicação dos filtros da média e da mediana. Figura 37 - Imagem Original As figuras 38,39 e 40, que serão apresentadas abaixo, referem-se à Figura 37 após a aplicação dos ruídos salt&pepper, gaussian e speckle, respectivamente.
Figura 38 - Imagem com ruído Salt&Pepper Figura 39 - Imagem com ruído Gaussian
Figura 40 - Imagem com ruído Speckle
Após a aplicação dos três tipos de ruídos citados anteriormente, foram aplicados os filtros de média e mediana em cada uma das imagens poluídas. Os resultados obtidos serão relatados logo abaixo.
Figura 41 - Imagem com ruído Salt&Pepper após a aplicação do filtro da média
Foi observado que após a aplicação do filtro da média na Figura 38 não foi possível eliminar todo ruído do tipo salt&pepper adicionado à essa. A imagem final apresenta discrepâncias em relação à Figura 37, que é a imagem original sem ruídos. É coerente afirmar também que o filtro da média não obteve sucesso na tarefa de remover totalmente o ruído do tipo gaussian adicionado à imagem escolhida. É possível observar o resultado visualizando a Figura 42 abaixo.
Figura 42 - Imagem com ruído Gaussian após a aplicação do filtro da média
A Figura43 ilustra a aplicação do filtro da média após a aplicação do ruído Speckle.
Figura 43 - Imagem com ruído Speckle após a aplicação do filtro da média
Pode-se concluir que, após a aplicação do filtro da média para os ruídos salt&pepper, gaussian e speckle, numa vizinhança 3x3 e uma densidade de ruído igual a 0.02, as imagens resultantes, embora mais nítidas, ainda possuem poluição visual. Entretanto, foram obtidos bons resultados para a aplicação do filtro da média em imagens com ruídos do tipo salt&pepper e speckle diminuindo-se a densidade para 0.001, deste modo, aumentando consideravelmente o espaçamento entre os pontos de ruído. Abaixo será relatado os resultados obtidos pela aplicação do filtro da mediana para os ruídos salt&pepper, gaussian e speckle. Primeiro, será mostrado o script feito em Matlab para aplicar esses tipos de ruídos. a = imread('13.jpg'); imshow(a); b = imnoise(a,’salt&pepper’,0.02); figure,imshow(b); c = medfilt2(b(:,:,1),[3 3]); figure,imshow(c); d = medfilt2(b(:,:,2),[3 3]); figure,imshow(d); e = medfilt2(b(:,:,3),[3 3]); figure,imshow(e); imagem_apos_mediana(:,:,1) = c; imagem_apos_mediana(:,:,2) = d; imagem_apos_mediana(:,:,3) = e; figure,imshow(imagem_apos_mediana);
A Figura 8 ilustra o resultado obtido após a aplicação do filtro da mediana, para uma vizinhança 3x3, utilizando-se uma imagem com ruído do tipo salt&pepper de densidade 0.02.
Figura 44 - Imagem com ruído Salt&Pepper após a aplicação do filtro da mediana
Observou-se que após a aplicação do filtro da mediana na Figura 2 não é possível observar a presença de ruídos na imagem resultante. A Figura 45 ilustra o resultado obtido após a aplicação do filtro da mediana em uma imagem com ruído do tipo gaussian. Observou-se que, para esse tipo de ruído, o filtro da média obteve uma pequena melhoria em relação aos resultados obtidos pela aplicação do filtro da mediana. A Figura 42 apresenta uma maior nitidez que a Figura 45.
Figura 45 - Imagem com ruído Gaussian após a aplicação do filtro da mediana
Aplicando-se o filtro da mediana na Figura 40, foi obtido o resultado abaixo ilustrado pela Figura 10:
Figura 46 - Imagem com ruído Speckle após a aplicação do filtro da mediana
Foi observado que após a utilização do filtro da mediana para o ruído do tipo speckle, a imagem final obtida apresenta uma grande quantidade de poluição.
4. Discussão
Questões importantes a serem levantadas, são:
Representação YUV
Um ponto importante que nos trouxe dificuldade foi a representação dos dados das imagens durante as transformações do sistema RGB para YUV. Visto que os dados armazenados em RGB são do tipo inteiro, enquanto no sistema YUV, os dados são do tipo ponto flutuante, o que leva a uma perda de precisão nas transformações de YUV para RGB caso se armazene a imagem YUV na mesma estrutura de dados de uma para RGB. Um erro cometido foi aplicar a transformação para YUV e armazenar-la as três bandas em um BufferedImage de modo a permitir que outros filtros continuassem recebendo BufferedImage como parâmetro. Tal abordagem é incorreta por levar a perdas de precisão. A solução utilizada foi armazenar as bandas UV em matrizes auxiliares de Double e armazenar um BufferedImage so com o Y, a qual pode ser trabalhada pelos outros métodos.
Remoção de Ruidos
Na fase de testes da remoção de ruídos utilizando os filtros da média e da mediana foi observado que embora a mediana produza melhores resultados, foi constatado que nos casos em que a densidade de ruído é muito pequena, o filtro da média é capaz de obter bons resultados. Observou-se que as imagens contaminadas por ruído do tipo gaussian o filtro da média obteve uma discreta melhora em relação ao da mediana.
Desvio Padrão
Qual formula utilizar para o calculo do desvio padrão? O estimado, calculado, ou?
5. Conclusão
No desenvolvimento deste trabalho, chegou-se às seguintes conclusões:
Manipulação em YUV Que as modificações na banda Y do sistema YUV de uma imagem influencia diretamente na luminosidade de suas cores, e não em suas cores em si.
Remoção de ruídos Que a remoção de ruídos é mais adequada com o uso do filtro da mediana.
Detalhes de linguagem Que a linguagem MATLAB oferece melhores facilidades na manipulação de matrizes, e consequentimente na melhor manipulação de imagens.
6. Referências Vital, L. (2005). Notas de Aula da disciplina Introdução ao Processamento Digital de Imagens.
http://www.datalyzer.com.br/site/suporte/administrador/info/arquivos/info54/54.html Acessado em 13/06/2009
Somente usuários registrados podem escrever comentários!
!joomlacomment 4.0 Copyright (C) 2009 Compojoom.com . All rights reserved." |