• Nenhum resultado encontrado

Otimização do Processamento de Imagens Médicas: Uma Abordagem Utilizando Java

N/A
N/A
Protected

Academic year: 2021

Share "Otimização do Processamento de Imagens Médicas: Uma Abordagem Utilizando Java"

Copied!
6
0
0

Texto

(1)

Otimização do Processamento de Imagens Médicas: Uma Abordagem Utilizando

Java

Priscila T. M. Saito, Ricardo J. Sabatine,

Fátima L. S. Nunes, Kalinka R. L. Jaquie CasteloBranco

Univem – Centro Universitário Eurípides de Marília

Av. Hygino Muzzi Filho 529, CEP 17509-901, Marília, SP

{psaito, sabatine, fatima, kalinka}@univem.edu.br

Abstract

This paper aims at demonstrating the use of parallel distributed computing to improve the execution time of algorithms used to the medical image processing. Image processing techniques were implemented in the sequential and parallel way by using the program language Java and the parallel virtual libraries mpiJava and JPVM. Smoothing and edge detection algorithms were implemented in the special domain, using different size of masks. After the implementation, it was possible to make a comparison between the sequential and parallel application, that permitted to evaluate and to demonstrate the gain using distributed parallel computing.

1. Introdução

O processamento de imagens é amplamente utilizado em muitas aplicações. Essa área de conhecimento exige intenso poder computacional, visto que as imagens apresentam, em sua grande maioria, tamanho elevado, constituindo grande volume de dados a serem processados.

Quando o contexto trata de imagens médicas, esta questão é ainda mais crítica, uma vez que aplicações médicas, em geral, requerem curto tempo de resposta e não se pode permitir armazenamento com perdas de dados. O tamanho elevado das imagens, aliado à necessidade de aplicação de algoritmos complexos, aumenta o tempo de processamento dessas imagens, prejudicando a avaliação das mesmas [6].

A necessidade de alto desempenho e alto poder computacional para o processamento desse tipo de imagem pode ser atendida por meio do uso de sistemas distribuídos e de bibliotecas de passagem de mensagens, que viabilizam a computação paralela distribuída.

2. Computação Paralela Distribuída

O aumento da utilização de sistemas computacionais distribuídos, associado aos conceitos de computação

paralela, permite que tarefas possam ser realizadas explorando maior potência computacional com relevante redução dos custos.

Apesar de possuir um meio de comunicação mais lento quando comparada à comunicação em uma máquina massivamente paralela, fator que degrada o desempenho, a computação paralela distribuída tem sido utilizada com sucesso para paralelizar aplicações que possuam pouca necessidade de comunicação entre os processos.

Existem diversos ambientes de passagens de mensagens especializados em fornecer recursos necessários à programação paralela, entre eles o MPI (Message Passing Interface) e o PVM (Parallel Virtual Machine).

Com o surgimento da linguagem Java, inúmeras propostas foram apresentadas para a utilização dessas bibliotecas nessa linguagem podendo-se citar o mpiJava [1] e o JPVM (Java Parallel Virtual Machine) [3], que constituem os ambientes de passagem de mensagens utilizados neste trabalho.

A escolha desses ambientes para o processamento paralelo dos algoritmos vem em decorrência do uso da linguagem Java que contém fatores como portabilidade, permitindo a independência de plataforma, simplicidade, clareza nos códigos e a existência de bibliotecas especializadas que possibilitam o reúso de código, facilitando a construção de aplicações nos mais diversos domínios, como é o caso do processamento de imagens.

3. Processamento de Imagens Médicas

A finalidade das imagens médicas é auxiliar na composição do diagnóstico de anomalias e fornecer material para acompanhamento de terapias [6].

Técnicas de processamento de imagens são aplicadas com o objetivo de melhorá-las e extrair informações úteis aos diagnósticos.

Existem inúmeros métodos de processamento de imagens. A escolha de procedimentos a serem aplicados depende do objetivo que se deseja em relação a uma determinada categoria de imagem.

(2)

Para este trabalho, inicialmente foram escolhidas técnicas de suavização e de detecção de bordas, largamente utilizadas nos sistemas de auxílio ao diagnóstico, a fim de verificar a relação custo/benefício decorrente da aplicação da computação paralela distribuída.

3.1. Suavização

Filtros de suavização são utilizados em uma etapa de pré-processamento para a redução de ruídos e para a remoção de pequenos detalhes de uma imagem antes da extração de objetos [4]. Entre as técnicas mais comuns de suavização estão os filtros de média e mediana.

A filtragem mediana usada neste artigo [4], consiste em substituir o valor de um determinado pixel pelo valor mediano da sua vizinhança que é o valor central obtido quando se ordena os pixels da vizinhança.

Na Figura 1 são apresentados exemplos da aplicação da filtragem mediana em imagens médicas.

Figura 1 - Exemplos de suavização utilizando o filtro mediana. (a) imagem mamográfica original; imagem

suavizada (b) máscara 3x3; (c) máscara 5x5; (d) máscara 7x7.

3.2. Detecção de Bordas

A detecção de bordas é outro exemplo de algoritmo que usa operações baseadas em vizinhança. Representar uma imagem por meio de suas bordas pode ser vantajoso, para muitos esquemas na área médica, visto que as bordas fornecem informações úteis para a composição de diagnósticos.

Para avaliação neste artigo foi utilizado o algoritmo de detecção de bordas fazendo uso dos operadores de Sobel modificado [4]. Estes calculam o valor absoluto aproximado do gradiente em cada ponto da imagem analisada, deixando em maior evidência as áreas cuja freqüência espacial possui um valor alto em relação à vizinhança e que correspondem às bordas da imagem.

A Figura 2 apresenta exemplos do resultado obtido com a aplicação desses operadores.

Figura 2 – Exemplos de detecção de bordas pelos operadores de Sobel modificado com diferentes

tamanhos de máscaras. (a) imagem original; (b) máscara 9x9; (c) 11x11.

4. Um Modelo de Paralelismo para o

Processamento de Imagens

O requisito básico de um sistema de processamento paralelo de imagens consiste em uma infra-estrutura que permita executar de forma eficiente quaisquer algoritmos de nível baixo, médio ou alto. Essa infra-estrutura é composta essencialmente de funções de comunicação e distribuição de dados adequados ao processamento de imagens [2].

Os filtros executados no domínio espacial, que manipulam diretamente os pixels que compõem a imagem, são os mais utilizados devido à facilidade de implementação, porém exigem alto poder de processamento, visto que as imagens constituem, na maioria das vezes, matrizes enormes de pontos a serem considerados.

É neste contexto que as técnicas de processamento de imagens e, em especial, aquelas desenvolvidas especificamente para aplicação em imagens médicas, podem se beneficiar dos conceitos de paralelização. A importância do paralelismo é ainda mais realçada visto que esta classe de imagens, quando destinada ao diagnóstico, não pode permitir armazenamento com perdas de dados. Além disso, muitas vezes, exigem precisão na sua aquisição gerando um volume ainda maior de dados.

Uma proposta de paralelização eficiente é a divisão da imagem em blocos distribuídos pelos processadores, de forma a processá-los ao mesmo tempo.

Definir o tipo de paralelismo que melhor se adapta ao processamento proposto é uma tarefa que permite a obtenção de melhor desempenho. No caso deste trabalho o paralelismo de dados é o que melhor se enquadra, pois define-se que o processador deve executar as mesmas tarefas sobre diferentes dados aproximadamente do mesmo tamanho, tendo um único fluxo de controle SPMD (Single Process Multiple Data).

(a) (b) (c)

(b)

(3)

O desafio a ser vencido, neste caso e, mais especificamente em imagens médicas, é a divisão da imagem em blocos e a posterior junção destes sem perdas de informações, após o processamento.

Considerando que no domínio espacial é comum a utilização de templates deve-se prever, ainda, uma sobreposição entre os blocos a fim de que não faltem dados durante o processamento das partes de uma imagem. Após o processamento, os dados sobrepostos devem ser desconsiderados a fim de que não fiquem duplicados na imagem resultante.

A Figura 3 ilustra uma estratégia de paralelização em que uma imagem médica é dividida em blocos pelo mestre, e subseqüentemente é transmitida por meio das bibliotecas mpiJava e JPVM aos escravos. Estes têm a incumbência de processar a imagem e retransmitir os blocos já processados ao mestre, o qual os une reconstituindo-a.

Figura 3. Estratégia de paralelização de imagens médicas [7].

Pode-se perceber também, nesta Figura pelo número de linhas em cada um dos blocos 1, 2 e 3, que os blocos apresentam tamanhos variados dependendo da característica de cada algoritmo. Alguns algoritmos abordados neste artigo usam templates que operam sobre uma vizinhança de pontos da imagem; sendo assim, há necessidade de redundância nos blocos para o processamento, conforme citado (destacados em vermelho na Figura 3).

5. Análise de Desempenho dos Resultados

Obtidos

A análise de desempenho dos algoritmos de filtro de mediana e de detecção de bordas foi realizada por meio de diferentes testes reais em um ambiente paralelo distribuído controlado, composto inicialmente por 3

máquinas homogêneas (Pentium IV de 2.7GHz com 512Mbytes de RAM, interligadas por uma rede ethernet de 100MB/s). Posteriormente foram acrescidas máquinas idênticas para compor um ambiente de 4 e 5 máquinas.

Foram utilizadas imagens mamográficas (radiografia das mamas) de elevado tamanho (aproximadamente 11 Mb, consistindo em matrizes com tamanho médio 2500X3000 pixels, no formato TIFF, com resolução de contraste de 16 bits). O filtro de mediana foi avaliado com máscaras de tamanhos diferentes (3x3, 5x5 e 7x7) utilizando o algoritmo de ordenação shellsort. O filtro de detecção de bordas foi executado com máscara de tamanho 11x11.

Observa-se que o tamanho da máscara é o que define o tamanho da vizinhança a ser considerada. Dependendo do tipo da imagem, uma maior vizinhança pode levar a um melhor resultado de processamento.

Após a realização dos testes obteve-se uma média dos 30 tempos de processamento tanto para aplicação seqüencial quanto para a paralela para os diferentes tipos de máscaras. Na avaliação da execução em paralelo foram efetuados testes com até cinco máquinas e, para cada uma delas, testes com até 8 processos sendo iniciados em paralelo. Isso possibilitou realizar a comparação de desempenho de cada uma das possíveis combinações.

Todos os testes foram efetuados usando as bibliotecas JPVM e mpiJava e os resultados obtidos foram avaliados estatisticamente para comprovar seu grau de significância por meio do uso do teste de hipótese [5].

As Figuras 4 e 5 apresentam os resultados da execução seqüencial do filtro mediana bem como as execuções em paralelo do mesmo algoritmo em 3, 4 e 5 máquinas respectivamente. 0 1000 2000 3000 4000 5000 6000 7000 8000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 4 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 3x3 fazendo uso do ambiente de troca de mensagens mpiJava.

Pelas figuras é possível observar que o tempo de execução do algoritmo seqüencial, quando considerada a vizinhança de tamanho 3x3, é significativamente melhor que o tempo do mesmo em paralelo, tanto usando JPVM quanto mpiJava, independentemente do número de

(4)

máquinas e da quantidade de processos iniciados em paralelo.

Uma vez que a quantidade de cálculos efetuados pelo filtro com máscara 3x3 é relativamente pequena, a paralelização do mesmo não resulta em melhoria, pois se consome mais tempo com comunicação para envio de dados através da rede do que no cálculo da máscara propriamente dita, ou seja, o tempo utilizado para o envio de cada parte da imagem (subvetor) é maior que o tempo gasto pelos escravos para realizar o processamento (formação e ordenação do vetor), o que a torna uma aplicação mais voltada para comunicação do que para processamento. 0 1000 2000 3000 4000 5000 6000 7000 8000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 5 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 3x3 fazendo uso do ambiente de troca de mensagens JPVM.

As Figuras 6, 7, 8 e 9 apresentam os resultados das mesmas execuções anteriores levando em consideração as máscaras 5x5 e 7x7, respectivamente. 0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 6 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 5x5 fazendo uso do ambiente de troca de mensagens mpiJava.

Pelas figuras é possível observar que o tempo de execução do algoritmo seqüencial a partir do uso dessas máscaras é significativamente pior que o tempo de execução em paralelo, tanto usando o JPVM quanto o mpiJava. Isso pode ser observado principalmente para situações onde o número de processos equivale ou é maior que o número de máquinas. Nesses casos pode-se

comprovar que o uso da computação paralela distribuída auxilia e otimiza o uso de algoritmos de processamento de imagens com grande volume de dados.

Nos casos em que o número de processos ultrapassa uma unidade em cada máquina o tempo médio de processamento paralelo fica um pouco prejudicado no caso da máscara 5x5 devido à sobrecarga na comunicação. À medida que se aumenta o número de processos para certa quantidade de máquinas, o desempenho diminui, tornando-se maior que o tempo médio seqüencial. Isso acontece porque quando se aumenta o número de processos a comunicação passa a ser um fator evidente de queda de desempenho.

0 1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 7 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 5x5 fazendo uso do ambiente de troca de mensagens JPVM.

Diferentemente das máscaras 3x3 e 5x5, quando utilizada a máscara 7x7, independentemente do número de processos iniciados (considerando um máximo de 8 processos) e do número de máquinas, o tempo médio paralelo é sempre menor que o tempo seqüencial, uma vez que o processamento é alto e o aumento no número de processos ainda implica em ganho de desempenho sobre a sobrecarga de comunicação. 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 8 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 7x7 fazendo uso do ambiente de troca de mensagens mpiJava.

Essa diferença e significativa melhora de desempenho, quando se usa uma arquitetura paralela distribuída, dá-se

(5)

pelo fato dos cálculos efetuados pelas máscaras serem volumosos, garantindo uma melhoria do uso em paralelo uma vez que a comunicação imposta se torna desprezível quando comparada ao ganho em relação aos cálculos efetuados. 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 3 Máquinas 4 Máquinas 5 Máquinas

Figura 9 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do

filtro de mediana de máscara 7x7 fazendo uso do ambiente de troca de mensagens JPVM.

Na Figura 10 podem ser observados os tempos de execução seqüencial e paralelo do mpiJava e do JPVM. Observa-se que a JPVM apresenta um melhor desempenho se comparado com a mpiJava, o que pode ser um indicativo que a biblioteca JPVM possui um comportamento relativamente melhor que a mpiJava para o filtro de mediana. De qualquer forma, em ambos os casos o desempenho médio da execução em paralelo é significativamente melhor que o da seqüencial.

0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000 3 4 5 6 7 8 Número de Processos M é d ia d o T e m p o d e E x e c u ç ã o (m s ) Sequencial mpiJava JPVM

Figura 10 – Média do tempo de execução da aplicação seqüencial comparada com as aplicações paralelas do filtro de mediana de máscara 7x7 fazendo uso dos

ambientes de troca de mensagem mpiJava e JPVM.

O número de processos mostrou ser um fator muito importante. No caso da biblioteca JPVM, o melhor número de processos é o mesmo que o número de máquinas que forma a máquina virtual. Já na mpiJava, o melhor resultado é obtido quando se tem um número maior de processos do que o número de máquinas participantes. Isso é devido ao fato de que a mpiJava usa um processo mestre que é contabilizado, mas não efetua a tarefa escrava propriamente dita.

As Figuras 11 e 12 apresentam os resultados da execução seqüencial do filtro de detecção de bordas bem como as execuções em paralelo do mesmo algoritmo em 4 e 5 máquinas utilizando máscara de tamanho 11x11 com as bibliotecas mpiJava e JPVM, respectivamente.

0 2000 4000 6000 8000 10000 12000 14000 16000 18000 M é d ia d o T e m p o d e E x c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 4 Máquinas 5 Máquinas

Figura 11 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do filtro de detecção de borda de máscara 11x11 fazendo

uso do ambiente de troca de mensagem mpiJava.

0 2000 4000 6000 8000 10000 12000 14000 16000 18000 M é d ia d o T e m p o d e E x e c u ç ã o (m s ) 3 4 5 6 7 8 Número de Processos Sequencial 4 Máquinas 5 Máquinas

Figura 12 – Média do tempo de execução da aplicação seqüencial comparada com a aplicação paralela do filtro de detecção de borda de máscara 11x11 fazendo

uso do ambiente de troca de mensagem JPVM.

É possível observar que independentemente do número de processos iniciados, o tempo médio paralelo, tanto fazendo uso do mpiJava quanto do JPVM, é sempre melhor que o seqüencial.

Nas Figuras 13 e 14 são apresentados os tempos de execução seqüencial e paralelo da mpiJava e da JPVM do filtro de detecção de bordas em 5 máquinas, com a utilização de máscara de tamanho 9x9 e 11x11, respectivamente. Pode-se observar que, da mesma forma que o filtro de mediana, considerando-se JPVM ou mpiJava, o desempenho médio da execução em paralelo é significativamente melhor que o da seqüencial.

Com a utilização de máscara de tamanho 9x9, observa-se que o JPVM apreobserva-senta um melhor deobserva-sempenho observa-se comparado com o mpiJava. O mpiJava consegue um melhor resultado que o JPVM quando o número de processos passa a ser maior, em uma unidade, que o número de máquinas utilizadas, ou seja, 5 máquinas e 6 processos.

(6)

Já com a utilização de máscara de tamanho 11x11, observa-se que o mpiJava apresenta um melhor desempenho se comparado com o JPVM. Isso implica que para se avaliar corretamente as bibliotecas novos estudos devem ser efetuados a fim de determinar suas diferenças e definir qual é a melhor, seja de forma geral ou específica, para alguns tipos de algoritmos de processamento de imagens. 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000 3 4 5 6 7 8 Número de Processos M é d ia d o T e m p o d e E x e c u ç ã o (m s ) Sequencial mpiJava JPVM

Figura 13 – Média do tempo de execução da aplicação seqüencial comparada com as aplicações paralelas

do filtro de detecção de borda de máscara 9x9 fazendo uso dos ambientes de troca de mensagem

mpiJava e JPVM. 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000 3 4 5 6 7 8 Número de Processos M é d ia d o T e m p o d e E x e c u ç ã o (m s ) Sequencial mpiJava JPVM

Figura 14 – Média do tempo de execução da aplicação seqüencial comparada com as aplicações paralelas

do filtro de detecção de borda de máscara 11x11 fazendo uso do ambiente de troca de mensagem

mpiJava e JPVM.

6. Conclusões

Partindo-se dos resultados obtidos pode-se verificar que existe um ganho em usar o processamento paralelo distribuído quando se pensa em processamento de imagens médicas. Acredita-se que a utilização de outros filtros no domínio espacial também possa prover melhora significativa de desempenho para a versão paralela quando comparada à execução seqüencial.

Apesar do resultado não ser favorável à execução paralela do filtro mediana quando aplicada a máscara 3x3 e, em alguns, casos a máscara 5x5, foi possível observar que para processamentos intensos o uso do processamento paralelo é bastante vantajoso e garante a otimização no

tempo de execução de algoritmos de processamento de imagens.

Com base nesses resultados obtidos têm-se como trabalhos futuros o desenvolvimento de novos algoritmos de processamento de imagens bem como a avaliação de outros algoritmos de ordenação presentes nestes algoritmos de processamento. Acredita-se também que a paralelização dos algoritmos de ordenação presentes nos algoritmos de processamento de imagens possa prover melhora significativa no desempenho dos mesmos.

Além disso, testes adicionais devem ser executados para avaliar também qual das duas bibliotecas utilizadas (JPVM e mpiJava) apresenta melhor desempenho, uma vez que para um mesmo filtro dependendo da máscara utilizada houve um comportamento diferente entre as mesmas. O desenvolvimento paralelo de outros algoritmos de processamento de imagens permitirá a obtenção de um conjunto maior de dados a partir do qual informações poderão ser extraídas com maior fidelidade a fim de construir uma base de comparação efetiva tanto no tocante aos algoritmos quanto as bibliotecas de passagem de mensagem.

Referências

[1] Baker, M. et al. (1998) mpiJava: A Java Interface to MPI. Submitted to First UKWorkshop on Java for High Performance Network Computing, Europar.

[2] Barbosa, Jorge M. G. (2000) Paralelismo em Processamento e Análise de Imagem Médica. Tese (Doutorado) apresentada ao Departamento de Engenharia Electrotécnica e de Computadores – Faculdade de Engenharia da Universidade do Porto, p.240.

[3] Ferrari, A. J.; (1998) JPVM: Network parallel computing in Java, In ACM 1998 Workshop on Java for High-Performance Network Computing, Palo Alto, February 1998. Concurrency: Pactice and Experience.

[4] Gonzalez, R. C.; Woods, R. E. (2002). Digital Image Processing. Addison-Wesley Publishing Company, Massachusetts, 2a. Edição.

[5] Jain, R. The Art of Computer Systems Performance Analysis: Techniques for Experimental Design, Measurement, Simulation, and Modeling. John Wiley & Sons, 1991.

[6] Nunes, F. L. S. M. (2001) Investigações em Processamento de Imagens Mamográficas para Auxílio ao Diagnóstico de Mamas Densas. São Carlos, p.230. Tese (Doutorado) apresentada ao Instituto de Física de São Carlos – Universidade de São Paulo.

[7] Saito, P. T. M.; Sabatine, R. J.; Nunes, F. L. S.; Branco, K. R. L. J. C. Uso da Computação Paralela Distribuída para Melhoria no Tempo de Processamento de Imagens Médicas. XIV Escola Regional de Informática da SBC - ERI-PR. Guarapuava, PR. 2007, pág 36 a 47, 2007.

Referências

Documentos relacionados

E) CRIE NO SEU CADERNO UM TÍTULO PARA ESSA HISTÓRIA EM QUADRINHOS.. 3- QUE TAL JUNTAR AS SÍLABAS ABAIXO PARA FORMAR O NOME DE CINCO SUGESTÕES DE PRESENTE PARA O DIA

Pelas figuras é possível observar que o tempo de execução do algoritmo seqüencial, quando considerada a vizinhança de tamanho 3x3, é significativamente

Por meio delas, é possível observar que o tempo de execução do algoritmo sequencial, melhor que o tempo do mesmo em paralelo, tanto usando mpiJava quanto JPVM,

•   O  material  a  seguir  consiste  de  adaptações  e  extensões  dos  originais  gentilmente  cedidos  pelo 

Consulte a Secção 11 para obter informações pormenorizadas sobre sintomas e efeitos na saúde.. Classificação conforme Regulamentação (EC) 1272/2008 [CLP/GHS] SECÇÃO

Também chegado a experimentações em diferentes tipos de registro sonoro, Arnaldo Antunes ressalta a diferença do que a tecnologia o permite gravar em pe- quenos estúdios, como a que

Com relação ao CEETEPS, o tema desta dissertação é interessante por se inserir no Programa de Educação de Jovens e Adultos (PROEJA), sob a tutela da Coordenação de

Both the distribution of toxin concentrations and toxin quota were defined by epilimnetic temperature (T_Epi), surface temperature (T_Surf), buoyancy frequency (BuoyFreq) and