81
ERCEMAPI 2009 ERCEMAPI 2009 29 de Outubro Parnaíba-PI é MC 5: Técnicas de Processamento MC 5: Técnicas de Processamento Digital de Imagens com Java Digital de Imagens com Java Digital de Imagens com Java Digital de Imagens com Java Iális Cavalcante – Engenharia da Computação UFC / Campus de Sobral

Técnicas de PDI com Java - Ercemapi 2009

Embed Size (px)

DESCRIPTION

Minicurso ministrado na ERCEMAPI 2009 com a apresentação das principais APIs Java para Processamento Digital de Imagens.

Citation preview

Page 1: Técnicas de PDI com Java - Ercemapi 2009

ERCEMAPI 2009ERCEMAPI 200929 de OutubroParnaíba-PI

ééMC 5: Técnicas de Processamento MC 5: Técnicas de Processamento Digital de Imagens com JavaDigital de Imagens com JavaDigital de Imagens com JavaDigital de Imagens com JavaIális Cavalcante – Engenharia da ComputaçãoUFC / Campus de Sobral

Page 2: Técnicas de PDI com Java - Ercemapi 2009

ObjetivosObjetivos

• Apresentar técnicas básicas que envolvem Processamento Digital de Imagens (PDI);Processamento Digital de Imagens (PDI);

• Apresentar APIs Java voltada para PDI;

• Desenvolver uma pequena aplicação em p q p çJava para descrição de regiões.

Page 3: Técnicas de PDI com Java - Ercemapi 2009

E quem é o apresentador?E quem é o apresentador?

Page 4: Técnicas de PDI com Java - Ercemapi 2009

AgendaAgenda

1. Introdução

2 API J I2. APIs Java para Imagem

3 Técnicas de Processamento Digital de3. Técnicas de Processamento Digital de Imagens (PDI)

4. Proposta de um Aplicativo de PDI

5. Considerações Finais

Page 5: Técnicas de PDI com Java - Ercemapi 2009

Vi ã G l b PDI• Visão Geral sobre PDI• Aplicações Reais

1. INTRODUÇÃO

Page 6: Técnicas de PDI com Java - Ercemapi 2009

IntroduçãoIntrodução

• PDI possui alguns conceitos em comum com Visão Computacional e Computação Gráfica

á(caso de Análise de Imagens - FootScanAge).

• Pixels formam uma imagem – função f(x,y)

• Primeiros registros de estudo – NASA (Guerra Fria)Fria)

• Aplicações Multidisciplinares

Page 7: Técnicas de PDI com Java - Ercemapi 2009

Comparativo

Processamento de ImagensImagem Imagem

Dado

C t ã G áfi

Dado

Computação Gráfica Visão Computacional

Page 8: Técnicas de PDI com Java - Ercemapi 2009

Definição de Imagem

Page 9: Técnicas de PDI com Java - Ercemapi 2009

Histórico

1921

1922

Anos 20 – Sistema BartlaneTransmissão de Imagens via cabo submarino

1922

gUma semana para três horas – Londres para Nova York

Page 10: Técnicas de PDI com Java - Ercemapi 2009

Histórico

Anos 20 (1925) – Sistema BartlaneAumento para cinco níveis de brilhoAumento para cinco níveis de brilho

Page 11: Técnicas de PDI com Java - Ercemapi 2009

Histórico

Primeira imagem da Lua.Obtida pela nave espacial americana Ranger 7Obtida pela nave espacial americana Ranger 7.31 de julho de 1964, 9:09 (17 minutos antes do impacto).

Page 12: Técnicas de PDI com Java - Ercemapi 2009

Aplicações em Saúde90

0 4

0.6

0.8

1

30

60

90

120

150

0.2

0.4

180 0

210 330

240

270

300

Page 13: Técnicas de PDI com Java - Ercemapi 2009

Aplicações em Saúde

Page 14: Técnicas de PDI com Java - Ercemapi 2009

Aplicações na Indústria Petrolífera

Page 15: Técnicas de PDI com Java - Ercemapi 2009

Aplicações na Agropecuária

Page 16: Técnicas de PDI com Java - Ercemapi 2009

Aplicações na Biologiap ç g

Page 17: Técnicas de PDI com Java - Ercemapi 2009

Aplicações em Imagens SAR

Page 18: Técnicas de PDI com Java - Ercemapi 2009

• API JAIAPI I J• API ImageJ

2. APIS JAVA PARA IMAGEM

Page 19: Técnicas de PDI com Java - Ercemapi 2009

Formatos de ImagensFormatos de Imagens

• TIFF, GIF, PNG, JPEG, BMP, PBM, PGM, PMN

P d i d 80 90• Padronizados nos anos 80 e 90.

• Suportados pela maioria das APIs e ling agens de p og amaçãolinguagens de programação.

Page 20: Técnicas de PDI com Java - Ercemapi 2009

Uso da linguagem Java

i

WhyWhy Java?Java?

• Atrativos:– Livre;– Portável (“write once, run anywhere”);– Sintaxe similar à linguagem C;– Possui facilidade de internacionalização dos caracteres;– Vasta documentação;– Coletor de lixo (para desalocação automática de memória);

– Facilidade de criação de programação distribuída e concorrente;P di O i t d Obj t– Paradigma Orientado a Objetos.

Page 21: Técnicas de PDI com Java - Ercemapi 2009

Java Advanced Imaging (JAI) APIg g ( )

PlanarImage

ColorModel Raster

ColorSpace SampleModel

DataBuffer

Estrutura da classe de suporte a imagem na API JAI. Adaptado de Santos (2004).

Page 22: Técnicas de PDI com Java - Ercemapi 2009

Java Advanced Imaging (JAI) API• Leitura/Escrita de Imagens

g g ( )

public class EScomJAI {public static void main(String[] args) {

// leitura da imagemPl I i JAI t ("fil l d" "L ")PlanarImage image = JAI.create("fileload", "Lenna.png");double[][] bandCombine = {{0.21f,0.71f,0.08f,0.0f}};// conversão do modelo de cores// conversão do modelo de coresimage = JAI.create("BandCombine", image, bandCombine);// escrita do arquivo// escrita do arquivoJAI.create("filestore",image,"lennagl.png","PNG");

}}}

Page 23: Técnicas de PDI com Java - Ercemapi 2009

ImageJ APIImageJ APIPlugin Plugin Plugin PluginPlugin

ImageJ

AWT

Java

Estrutura geral da API ImageJ. Adaptado de Burger & Burge (2009).

Page 24: Técnicas de PDI com Java - Ercemapi 2009

ImageJ API SoftwareImageJ API Software

• Uso de plugins expande a comunidade de desenvolvedores;;

Di ibili ft ã• Disponibiliza um software com a execução de todas as funcionalidades implementadas;

Page 25: Técnicas de PDI com Java - Ercemapi 2009

Listagem: ExibeImagem.javapublic class ExibeImagem extends JFrame {

public ExibeImagem() throws IOException { // início do construtorBufferedImage imagem = ImageIO.read(new File(“Lenna.png”));String infoImagem = “Dimensões: ”+imagem.getWidth()+“x”+imagem.getHeight()+“ Bandas: ”+ imagem.getRaster().getNumBands();ImageIcon icone = new ImageIcon(imagem);JLabel labImagem = new JLabel(icone);(…) // adiciona labImagem e infoImage à interfacethis.setVisible(true);

} // fim do construtor// Método principalpublic static void main(String args[]){p ( g g []){

try{ // tratamento de exceção de E/SExibeImagem appExibeImg = new ExibeImagem();

}catch(IOException exc){} ( p ){System.out.println(“Erro de leitura! ”+exc.getMessage());

}} // fim do método principal} // fim do método principal

} // fim da classe

Page 26: Técnicas de PDI com Java - Ercemapi 2009

Resultado: ExibeImagem.java

Imagem Original. Fonte: Imagemadaptada de http://www.lenna.org/.p p // g/

Imagem exibida pela classe.

Page 27: Técnicas de PDI com Java - Ercemapi 2009

• Tipos de Imagens• Tipos de Imagens• Realce• Segmentação• Morfologia MatemáticaMorfologia Matemática

3. TÉCNICAS DE PROCESSAMENTOPROCESSAMENTODIGITAL DE IMAGENS

Page 28: Técnicas de PDI com Java - Ercemapi 2009

Técnicas de Base para AplicativoTécnicas de Base para Aplicativo

• Realce – Negativo e Filtragem (Passa-Baixa e Passa-Alta )

• Segmentação – Limiarização e WatershedSegmentação Limiarização e Watershed

Morfologia Matemática Erosão Dilatação• Morfologia Matemática – Erosão, Dilatação, Abertura e Fechamento

Page 29: Técnicas de PDI com Java - Ercemapi 2009

Tipos de ImagensTipos de Imagens

Imagem Binária Imagem em Imagem Coloridag gNíveis de Cinza

g

Page 30: Técnicas de PDI com Java - Ercemapi 2009

CMYKCMYK

RGB

HSV

Page 31: Técnicas de PDI com Java - Ercemapi 2009

double[][] bandCombine = { {R, G, B, 0.0f} };image = JAI.create("BandCombine", image, bandCombine);

R = 1.0fG = 0.0f

R = 0.0fG = 1.0f

R = 0.0fG = 0.0f

B = 0.0f B = 0.0f B = 1.0f

Page 32: Técnicas de PDI com Java - Ercemapi 2009

Negativo de uma Imagem• Negativo de uma Imagem

– Realce com processamento ponto-a-ponto

g g

Realce com processamento ponto a ponto– Aplicações em imagens médicas– Reverter a ordem do preto para o branco

• Intensidade da imagem de saída diminui• Intensidade da entrada aumenta

s L 1 r• s = L – 1 – r

Page 33: Técnicas de PDI com Java - Ercemapi 2009

Negativo de uma Imagemg gs = T(r)

T(r)

Claro

T(r)

ro

Imagem OriginalEscur

Função de Transformação

rEscuro Claro

ç ç

Imagem Processada

Page 34: Técnicas de PDI com Java - Ercemapi 2009

Presença de Ruído em ImagensPresença de Ruído em Imagens

õ f• Distorções em uma imagem afetam a percepção da sua real informação;

• Uma distorção crítica é a presença de ruído;• Uma distorção crítica é a presença de ruído;– Implica em nova informação na imagem;

• Normalmente os ruídos são definidos por puma distribuição estatística:– modelo gaussiano, speckle, poisson, etc.g , p , p ,

Page 35: Técnicas de PDI com Java - Ercemapi 2009

Efeito do RuídoEfeito do Ruído

Imagem Original

Mudanças de Perspectivasç p

Page 36: Técnicas de PDI com Java - Ercemapi 2009

Efeito do RuídoEfeito do Ruído

Imagem Ruidosa“Sal e Pimenta”

Mudanças de Perspectivasç p

Page 37: Técnicas de PDI com Java - Ercemapi 2009

Efeito do RuídoEfeito do Ruído

Imagem RuidosaSpeckle

Mudanças de Perspectivasç p

Page 38: Técnicas de PDI com Java - Ercemapi 2009

Efeito do RuídoEfeito do Ruído

Presença de ruído Poisson.

Imagem Original

Presença de ruído Speckle.Presença de ruído“Sal e pimenta”.

Page 39: Técnicas de PDI com Java - Ercemapi 2009

Realce com Processamento por Máscara

(1) (2)

(3) (4)

Page 40: Técnicas de PDI com Java - Ercemapi 2009

Realce com Processamento por Máscara

Exemplo de Máscara (3x3)

• g(x,y) = T[f(x,y)] (T opera em uma vizinhança de g( ,y) [ ( ,y)] ( p çpixels)

• z5’ = R = w1z1 + w2z1+ ... + w9z9 (Filtro Linear)5 1 1 2 1 9 9 ( )– z5’: soma ponderada de pixels na vizinhança de z5

• z5 = max(zk, k = 1, 2, ... 9) (Filtro Não-Linear)z5 max(zk, k 1, 2, ... 9) (Filtro Não Linear)– Não satisfaz a condição de um filtro linear

Page 41: Técnicas de PDI com Java - Ercemapi 2009

Tipos de Filtragemp g

• A distribuição de valores na máscara define o tipo de filtragem:p g– Passa-alta

• Aguçamento das bordas;• Aguçamento das bordas;

– Passa-baixaS ã d íd b t d i• Supressão de ruído, borramento da imagem;

– Passa-banda• Restauração da imagem.

Page 42: Técnicas de PDI com Java - Ercemapi 2009

Detectores de Bordas (Gradiente – Passa-Alta)

Imagem Original Filtro de Prewitt

Filtro de Sobel Filtro de Roberts

Page 43: Técnicas de PDI com Java - Ercemapi 2009

Definição de GradienteDefinição de Gradiente

s = [1 2 1; 0 0 0; -1 -2 -1];A = zeros(10);

(a) (b)

Fig a (a) Imagem o iginal (b) Imagem( );

A(3:7,3:7) = ones(5);H = conv2(A,s);mesh(H)

Figura – (a) Imagem original; (b) Imagemapós aplicação do filtro de Sobel.

Page 44: Técnicas de PDI com Java - Ercemapi 2009

Filtro de Suavização (passa-baixa)• São úteis para redução de ruído e borramento de

imagensimagens– Detalhes são perdidos

• O tamanho da máscara (ou seja vizinhança) determina o grau• O tamanho da máscara (ou seja, vizinhança) determina o grau de suavização e perda de detalhes.

– Os elementos da máscara devem ser números positivosp– Exemplo: Média Local

– R = 1/9 (1z1 + 1z2 + ... +1z9)              normalizado: dividido por 9

Page 45: Técnicas de PDI com Java - Ercemapi 2009

Filtro por mediana (não-linear)• Substitua f(x,y) pela mediana [f(x’,y’)] onde (x’,y’) pertence a 

vizinhançaç• Muito efetivo na remoção do ruído com componentes do 

tipo espigada (“spike”, ocorrências aleatórias de valores brancos e pretos)

• Preserva melhor as bordas• Exemplo:

10 20 20

20 15 20Ordenar

(10,15,20,20,20,20,20,25,100)

25 20 100

– Mediana = 20, então substitua (15) por (20)

Page 46: Técnicas de PDI com Java - Ercemapi 2009

Filtragem da Mediana

Imagem Ruidosa Filtragem com Janela 3x3Imagem Ruidosa“Sal e Pimenta”

Filtragem com Janela 3x3

Filtragem com Janela 5x5 Filtragem com Janela 7x7

Page 47: Técnicas de PDI com Java - Ercemapi 2009

Limiarização

í

ç

• Comprime a faixa de nível de cinza de pouco interesse– Inclinação da linha entre [0,1]

• Alargamento da faixa de nível de cinza de maior interesse

– Inclinação da linha monotonicamente crescente

– r1 = r2

– s1 = 0 e s2 = L – 1

Page 48: Técnicas de PDI com Java - Ercemapi 2009

Limiarizaçãoçs = T(r)

Claro

T(r)

ro

Imagem OriginalEscur

Função de Transformação

rEscuro Claro

Imagem Processada

Page 49: Técnicas de PDI com Java - Ercemapi 2009

Limiarizaçãoç

Imagem Original Limiar de 130

Limiar de 140 Limiar de 150

Page 50: Técnicas de PDI com Java - Ercemapi 2009

Watershed

Conside ando ma imagem em tom de cin a como• Considerando uma imagem em tom de cinza como uma superfície topográfica:– Todos os vales foram perfurados na sua área maisTodos os vales foram perfurados na sua área mais

funda da superfície;– Toda a superfície é lentamente preenchida por água,

este irá progressivamente inundar todas as bacias daeste irá progressivamente inundar todas as bacias da imagem;

• Represas podem ser aumentadas onde a água vem de dois pontos distintos podendo se unir;pontos distintos, podendo se unir;

– Ao fim da inundação, cada bacia é cercada por cumes (represas) representando seu limite.

– Este processo define a divisão das regiões presentes na imagem.

Page 51: Técnicas de PDI com Java - Ercemapi 2009

Watershed

Imagem Original Imagem em Níveis de Cinza

Imagem com Marcadores Imagem Final

Page 52: Técnicas de PDI com Java - Ercemapi 2009

Watershed

Animação sobre Watershed. Fonte: http://cmm.ensmp.fr/~beucher/wtshed.html.

Page 53: Técnicas de PDI com Java - Ercemapi 2009

Watershed

O bj t d i ã d fi id• Os objetos das imagens são definidos como as regiões de muitos valores de escala de i t tcinza constantes.

• O operador gradiente irá realçar os limites dos objetos (fim da inundação).j ( ç )

• Os marcadores indicam de forma brutaOs marcadores indicam, de forma bruta, onde os objetos estão localizados na imagem (ponto de partida da inundação).(ponto de partida da inundação).

Page 54: Técnicas de PDI com Java - Ercemapi 2009

Morfologia Matemática• Elemento Estruturante (EE):

Morfologia Matemática

– Structuring Element (SE)– Pequeno conjunto usado para reconhecer a

f l d b dmorfologia do objeto de interesse em uma imagem.– Forma e tamanho devem ser adaptados para as

i d d ét i d i dpropriedades geométricas da imagem processada.

0 50.5

1

1.5

2

2.5

1

2

3

1

2

3

3

3.5

4

4.5

5

4

5

6

7

4

5

6

7

0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.55.5 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5

7

1 2 3 4 5 6 7

Page 55: Técnicas de PDI com Java - Ercemapi 2009

Morfologia MatemáticaMorfologia Matemática

• Erosão e Dilatação• A partir destes: Abertura e Fechamentop

Page 56: Técnicas de PDI com Java - Ercemapi 2009

Morfologia MatemáticaMorfologia Matemática

• Erosão não é o inverso da dilatação!– Uma erosão seguida de uma dilatação nemUma erosão seguida de uma dilatação nem

sempre retorna a imagem original.

• B quadrado 3x3

Page 57: Técnicas de PDI com Java - Ercemapi 2009

Morfologia MatemáticaMorfologia Matemática

Imagem Original Resultado da Erosão

Elemento Estruturante

R

Resultado da DilataçãoRaio = 11

Page 58: Técnicas de PDI com Java - Ercemapi 2009

Morfologia Matemática• Abertura

Morfologia Matemática

– Resultado da erosão seguida da dilatação;• Usando o mesmo elemento estruturante.

• γB(X) = δB(εB(X))

– Propriedades:• Idempotente;Idempotente;• Crescente;• Anti-extensiva; ?

Figura–Abertura com EE circular: (a) imagem originale (b) sobreposição do resultado.

(a) (b)

Resultado da abertura é sempre menor ou igual àimagem original.

( ) p ç

Page 59: Técnicas de PDI com Java - Ercemapi 2009

Morfologia Matemática• Fechamento

Morfologia Matemática

– Dual da Abertura;– Resultado da dilatação seguida da erosão

• Usando o mesmo elemento estruturante.• φB(X) = εB(δB(X))

– Propriedades:• Idempotente;Idempotente;• Crescente;• Extensiva; ?

Resultado da abertura éi i l à Figura – Fechamento com EE circular:

(a) (b)

sempre maior ou igual àimagem original.

Figura Fechamento com EE circular:(a) imagem original e (b) sobreposição do resultado.

Page 60: Técnicas de PDI com Java - Ercemapi 2009

Morfologia MatemáticaMorfologia Matemática

Imagem Original Resultado da Abertura

Elemento Estruturante

R

Resultado do FechamentoRaio = 11

Page 61: Técnicas de PDI com Java - Ercemapi 2009

Morfologia MatemáticaMorfologia Matemática

Imagem Original Resultado da Erosão Resultado da Dilatação

Resultado da Abertura Resultado do Fechamento

Page 62: Técnicas de PDI com Java - Ercemapi 2009

• Definição do aplicativoDefinição do aplicativo• Uso da API ImageJ• Desenvolvimento

4. PROPOSTA DE UM APLICATIVO DE PDI

Page 63: Técnicas de PDI com Java - Ercemapi 2009

Fluxograma Imagem Ruidosau og a a Ruidosa

FiltragemFiltragem(eliminação do ruído)

Segmentação(separação de regiões)(separação de regiões)

Pós‐ProcessamentoObjeto está 

bem identificado?

Não

Imagem

Sim

Imagem Processada

Page 64: Técnicas de PDI com Java - Ercemapi 2009

Aplicando Filtro da Mediana// objeto “imagem"” da classe java.awt.Image instanciado// com a imagem originalByteProcessor processador = new ByteProcessor(imagem);ByteProcessor processador = new ByteProcessor(imagem);processador.medianFilter();// resultado do filtro é passado ao objeto “imagem”// p j gimagem = processador.createImage();

Imagem Ruidosa Imagem Filtrada

Page 65: Técnicas de PDI com Java - Ercemapi 2009

Aplicando Segmentação// objeto “imagem” da classe java.awt.Image instanciado// com a imagem filtradaByteProcessor processador = new ByteProcessor(imagem);ByteProcessor processador = new ByteProcessor(imagem);// “valorLimiar” é inteiro e que indica o limiar da segmentaçãoprocessador.threshold(valorLimiar);p ( );// resultado da limiarização é passado ao objeto “imagem”imagem = processador.createImage();

Imagem Filtrada Imagem Segmentada

Page 66: Técnicas de PDI com Java - Ercemapi 2009

Aplicando Fechamento// objeto “imagem” da classe Image instanciado com a imagem segmentadaByteProcessor processador = new ByteProcessor(imagem);// etapa de dilatação - 1o passo do fechamento// etapa de dilatação 1 passo do fechamentoprocessador.dilate(1,0);imagem = processador.createImage();

d B P (i )processador = new ByteProcessor(imagem);// etapa de erosão - 2o passo do fechamentoprocessador.erode(1,0);p ( , );imagem = processador.createImage();

Imagem Segmentada

Imagem Final

Page 67: Técnicas de PDI com Java - Ercemapi 2009

Melhor uso de memória

E i ú l d iá i á i• Evitar o acúmulo de variáveis estáticas no método principal– Para auxiliar o desempenho do coletor de lixo

da máquina virtual Java.• O uso de variáveis estáticas deve ser

evitado– Ocupam muito recurso de memória– São as últimas instâncias a serem eliminadasSão as últimas instâncias a serem eliminadas

pelo garbage collector

Page 68: Técnicas de PDI com Java - Ercemapi 2009

Melhor uso de memória

E ã d b ll• Execução do garbage collector:– System.gc() ou

– Runtime rt = Runtime.getRuntime();g ();rt.gc();long mem = rt freeMemory();long mem = rt.freeMemory();

E ã f t d () d lt• Execução frequente de gc() pode resultarna degradação do desempenho.

Page 69: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (visão geral)bli l S RdI t d JF {public class SegRdI extends JFrame {

// atributosJPanel painelPrinc, painelBotoes;

b b b b bJButton btnAbrir, btnProc, btnLimpar, btnSair;File fileName; ImagePlus imagemIJ;// inicialização dos componentes gráficospublic void iniciaComponentes() { ... }// método da ação ao clicar o botão Abrirprivate void abrirActionPerformed(ActionEvent evt) { … }// método da ação ao clicar o botão Processarprivate void processarActionPerformed(ActionEvent evt) { … }// método da ação ao clicar o botão Limparprivate void limparActionPerformed(ActionEvent evt) { … }// método da ação ao clicar o botão Sairprivate void sairActionPerformed(ActionEvent evt) { System.exit(0); }// construtor padrãopublic SegRdI() { this.iniciaComponentes(); }// método principalp ppublic static void main(String[] args) { SegRdI aplicacao = new SegRdI(); }} // fim da classe

Page 70: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (inicia interface gráfica)public void iniciaComponentes(){

this.setLayout(new BorderLayout()); painelPrinc = new JPanel();painelPrinc.setLayout(new BorderLayout()); this.add(painelPrinc, BorderLayout.CENTER);

i lB t JP l() i lB t tL t( Fl L t())painelBotoes = new JPanel(); painelBotoes.setLayout(new FlowLayout());this.add(painelBotoes, BorderLayout.SOUTH);

// adicionando botões// adicionando botõesbtnAbrir = new JButton(); painelBotoes.add(btnAbrir); btnAbrir.setText(“ Abrir ... ”);btnProc = new JButton(); painelBotoes.add(btnProc); btnProc.setText(“Processar”);// -> faz-se o mesmo para os botões “btnLimpar” e “btnSair”// -> faz-se o mesmo para os botões btnLimpar e btnSair

// configurar ações dos botõesbtnAbrir addActionListener(new ActionListener() {btnAbrir.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent evt) { abrirActionPerformed(evt); } } );btnProc.addActionListener( ... ); // relacionar com o método processarActionPerformedbtnLimpar.addActionListener( ... ); // relacionar com o método limparActionPerformedp ( ); // pbtnSair.addActionListener( ... ); // relacionar com o método sairActionPerformed

this.setVisible(true); this.setSize(450,350);this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

} // fim do método initComponents

Page 71: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (limpar interface)

private void limparActionPerformed(ActionEvent evt) {ImagePlus imp = new ImagePlus();ImageCanvas ic = new ImageCanvas(imp);g g ( p)painelPrinc.removeAll();painelPrinc.add(ic,BorderLayout.CENTER);p ( , y );

} // fim do método limparActionPerformed

Page 72: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (abrir imagem)private void abrirActionPerformed(ActionEvent evt) {

// exibe caixa de diálogo para abrir arquivo de imagemJFileChooser dialogo = new JFileChooser();JFileChooser dialogo = new JFileChooser();dialogo.setFileSelectionMode(JFileChooser.FILES_ONLY);int result = dialogo.showOpenDialog(this);if (result == JFileChooser CANCEL OPTION) return;if (result == JFileChooser.CANCEL_OPTION) return;// recupera arquivo selecionadofileName = dialogo.getSelectedFile();// exibe erro se inválido// exibe erro se inválidoif (fileName == null || fileName.getName().equals(“”)) {

JOptionPane.showMessageDialog(this, “Nome de Arquivo Inválido”,“Nome de Arquivo Inválido” JOptionPane ERROR MESSAGE); return; }“Nome de Arquivo Inválido”, JOptionPane.ERROR_MESSAGE); return; }

imagemIJ = new ImagePlus(fileName.toString());JScrollPane sp = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JS llP HORIZONTAL SCROLLBAR AS NEEDED)JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);ImageCanvas ic = new ImageCanvas(imagemIJ); sp.add(ic);sp.setSize(imagemIJ.getWidth(), imagemIJ.getHeight());

l dd( d C )painelPrinc.add(sp,BorderLayout.CENTER);} // fim do método abrirActionPerformed

Page 73: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (processamento da imagem - I)

private void processarActionPerformed(ActionEvent evt) {Image image = imagemIJ.getImage();B t P b t P B t P (i )ByteProcessor byteProc = new ByteProcessor(image);byteProc.medianFilter();image = byteProc.createImage();I Pl i Filt I Pl (“filt ” i )ImagePlus imFilt = new ImagePlus(“filtragem”,image);// descobrindo maior valor de nível de cinzaint max = -1;for(int lin = 0; lin < imFilt.getHeight(); lin++)

for(int col = 0; col < imFilt.getWidth(); col++){int[] pixels = imFilt.getPixel(col, lin);if (pixels[0]>max) max = pixels[0]; }

image = imFilt.getImage(); byteProc = new ByteProcessor(image);// aplicando a segmentação através de limiarizaçãobyteProc.threshold(max-1);image = byteProc.createImage();ImagePlus imSeg = new ImagePlus(“segmentacao”,image);image = imSeg.getImage(); byteProc = new ByteProcessor(image);

Page 74: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (processamento da imagem - II)

// inicialmente aplica-se a dilataçãobyteProc.dilate(1,0);i b t P t I ()image = byteProc.createImage();ImagePlus imDil = new ImagePlus(“dilatacao”,image);image = imDil.getImage(); byteProc = new ByteProcessor(image);// posteriormente aplica-se a erosãobyteProc.erode(1,0);image = byteProc createImage();image = byteProc.createImage();ImagePlus imErosao = new ImagePlus(“erosao”,image);JScrollPane sp = new JScrollPane(

JS llP VERTICAL SCROLLBAR AS NEEDEDJScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

ImageCanvas ic = new ImageCanvas(imErosao); sp.add(ic);g gsp.setSize(imErosao.getWidth(), imErosao.getHeight());painelPrinc.removeAll();painelPrinc add(sp BorderLayout CENTER);painelPrinc.add(sp,BorderLayout.CENTER);

} // fim do método processarActionPerformed

Page 75: Técnicas de PDI com Java - Ercemapi 2009

Listagem: SegRdI.java (acrescentando escrita)

// adotando a API Java 2D (alternativa para ImageJ)BufferedImage bi = new BufferedImage(imErosao getWidth()BufferedImage bi = new BufferedImage(imErosao.getWidth(),

imErosao.getHeight(), BufferedImage.TYPE_BYTE_BINARY);Graphics2D g2 = bi.createGraphics();p g p ();g2.drawImage(image, 0, 0, null);g2.dispose();try { ImageIO.write(bi, "png", new File("imagemFinal.png")); }catch(IOException ioe) { System.out.println( ioe.getMessage() ); }

// ou ainda, misturando com a API JAIPlanarImage imagemFinal = JAI.create("awtimage", image);g g ( g , g );JAI.create("filestore",imagemFinal,"imagemFinal.png","PNG");

Page 76: Técnicas de PDI com Java - Ercemapi 2009

AplicativoAplicativo

Page 77: Técnicas de PDI com Java - Ercemapi 2009

P tPra encerrar o assunto...

5. CONSIDERAÇÕES FINAIS

Page 78: Técnicas de PDI com Java - Ercemapi 2009

Conclusões e Considerações Finaisç

• Algumas noções de PDI foram expostas• Algumas noções de PDI foram expostas para o desenvolvimento de um aplicativo específico;específico;

• Nas APIs Java:– a JAI apresenta melhor tratamento de

entrada/saída;á– ImageJ traz mais implementações básicas em

sua versão padrão;í í– As duas são bem flexíveis e extensíveis;

– Pode-se criar um aplicativo combinando as duas APIs.

Page 79: Técnicas de PDI com Java - Ercemapi 2009

Dú id ?Dúvidas?

Page 80: Técnicas de PDI com Java - Ercemapi 2009

Se gostou então podemos conversarSe gostou, então podemos conversar ...

encontre me aqui:... encontre-me aqui:

http://engcomp.sobral.ufc.br/professores/ialis/

http://www.linkedin.com/pub/ialis-cavalcante/13/b35/46

http://osum.sun.com/profile/IalisJunior

http://www.slideshare.net/ialis [email protected]

Page 81: Técnicas de PDI com Java - Ercemapi 2009

Obrigado, ...... e vamos para o almoço!... e vamos para o almoço!