Professional Documents
Culture Documents
Rafael Santos
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
1 /146
Objetivo
Apresentar conceitos, tcnicas e exemplos bsicos de aplicao de processamento de imagens digitais. Implementaes em Java opcionalmente com a API JAI (Java Advanced Imaging). Parte reduzida do livro on-line Java Image Processing Cookbook (http://www.lac.inpe.br/JIPCookbook/index.jsp). Cdigo!
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
2 /146
Introduo
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
3 /146
Sensoriamento Remoto:
Geologia (estudo da composio da superfcie). Agricultura (determinao da cobertura vegetal). Engenharia Florestal (idem). Cartografia (mapeamento da superfcie). Meteorologia.
Medicina e Biologia. Astronomia (macro) e Fsica (micro). Produo e Controle de Qualidade. Segurana e Monitoramento. Documentos, Web, etc.
http://www.lac.inpe.br/~rafael.santos 4 /146
Fevereiro/2010
Imagens Digitais
Imagem = matriz de pixels. Pixel = medida, conjunto de medidas ou ndice para tabela de valores. Metadados: dados adicionais sobre a imagem.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
5 /146
Imagens e Pixels
34 29 105 12 30 105 34 29 105 34 29 105 34 29 105 12 30 105 34 29 105
Fevereiro/2010
34 42 42 29 49 49 105 97 97 34 14 34 29 48 29 105 97 105 34 69 36 29 76 54 105 97 104 12 85 113 30 103 108 105 85 72 34 58 100 29 53 123 105 105 66 34 42 90 29 49 115 105 97 78 42 35 85 49 41 103 97 105 85
http://www.lac.inpe.br/~rafael.santos
Cmera Digital
3264x2448 elementos sensores Resoluo: no se aplica 3 bandas Cada pixel discretizado com valores entre 0 e 255
Scanner
Array mvel de elementos sensores Resoluo: 2400 DPI ou mais 3 bandas Discretizao varivel
http://www.lac.inpe.br/~rafael.santos 7 /146
Fevereiro/2010
Pixels podem ter mais que trs valores associados a eles. Pixels podem ter valores fora do tradicional intervalo [0, 255]. Pixels no precisam representar valores inteiros ou positivos! Imagens multispectrais e hiperspectrais. Imagens de modelos de terreno, mdicas (Raio-X), etc.
Exemplos:
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
8 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
9 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
10 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
11 /146
http://www.cossa.csiro.au/hswww/Overview.htm
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
12 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
13 /146
Ajuda e muito, mas no imprescindvel. Experincia com C++, C#, outras linguagens pode ajudar.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
14 /146
Popularidade e flexibilidade de Java. Temos APIs para representao, visualizao e I/O simples de imagens como parte do JSE. Temos a API Java Advanced Imaging para operaes muito mais poderosas, flexveis e complexas! E a questo da performance?
Melhor do que esperado! No estou preocupado com real time. Mais valor clareza e simplicidade de cdigo.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
15 /146
API adicional (download separado). Projeto do java.net pblico mas no totalmente aberto.
Muitos operadores especficos para processamento de imagens. Execuo postergada e cadeias de operadores. Representao mais poderosa e flexvel de imagens (tiles). Alguns operadores acelerados (implementao nativa). Dvida: ter apoio da Oracle?
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
16 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
17 /146
RenderedImage
ColorModel
ColorSpace
Raster
SampleModel DataBuffer
Fevereiro/2010
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
19 /146
Representao de Imagens
RenderedImage
WritableRenderedImage
BufferedImage
ImageJAI
PlanarImage
RenderedOp
API JAI
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos
TiledImage
20 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
21 /146
Criando Imagens (sem JAI) Imagens simples (RGB, puro preto-e-branco, nveis de cinza; pixels so arrays de bytes). 1. Criamos instncia de BufferedImage. 2. Criamos instncia de WritableRaster associada BufferedImage. 3. Manipulamos os pixels do WritableRaster.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
22 /146
Criando Imagens (com JAI) Imagens simples (RGB, puro preto-e-branco, nveis de cinza) ou multibandas; pixels podem ser arrays de qualquer tipo nativo. 1. Criamos instncia de SampleModel usando RasterFactory. 2. Criamos um TiledImage com este SampleModel. 3. Criamos um WritableRaster a partir da TiledImage. 4. Manipulamos os pixels do WritableRaster.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
24 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
25 /146
Criando Imagens (com JAI) Para imagens com tiles um pouco mais complicado... 1. Criamos instncia de SampleModel usando RasterFactory. 2. Criamos um TiledImage com este SampleModel. 3. Para cada tile:
1. criamos um WritableRaster a partir da TiledImage. 2. Manipulamos os pixels do WritableRaster.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
26 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
27 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
28 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
29 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
30 /146
Entrada e Sada
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
31 /146
Entrada e Sada
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
32 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
33 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
34 /146
Fevereiro/2010
Exibindo Imagens
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
36 /146
Visualizao de Imagens
Componentes de interfaces grficas para mostrar imagens. Geralmente bem simples, melhorias como interatividade, processamento, etc. ficam por conta do programador...
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
37 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
38 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
39 /146
DisplayJAI mais flexvel, permite alguma interao (no implementada). No parte da API JAI (!?).
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
40 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
41 /146
Imagens Sincronizadas
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
42 /146
Imagens Sincronizadas
public class DisplayTwoSynchronizedImages extends JPanel implements AdjustmentListener { protected DisplayJAI dj1; protected DisplayJAI dj2; protected JScrollPane jsp1; protected JScrollPane jsp2;
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
43 /146
Imagens Sincronizadas
public DisplayTwoSynchronizedImages(RenderedImage im1, RenderedImage im2) { super(); // Cria componente com duas imagens com JScrollPanes setLayout(new GridLayout(1,2)); dj1 = new DisplayJAI(im1); dj2 = new DisplayJAI(im2); jsp1 = new JScrollPane(dj1); jsp2 = new JScrollPane(dj2); add(jsp1); add(jsp2); // Registra listeners para os scroll bars do JScrollPanes jsp1.getHorizontalScrollBar().addAdjustmentListener(this); jsp1.getVerticalScrollBar().addAdjustmentListener(this); jsp2.getHorizontalScrollBar().addAdjustmentListener(this); jsp2.getVerticalScrollBar().addAdjustmentListener(this); }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
44 /146
Imagens Sincronizadas
public void adjustmentValueChanged(AdjustmentEvent e) { if (e.getSource() == jsp1.getHorizontalScrollBar()) jsp2.getHorizontalScrollBar().setValue(e.getValue()); if (e.getSource() == jsp1.getVerticalScrollBar()) jsp2.getVerticalScrollBar().setValue(e.getValue()); if (e.getSource() == jsp2.getHorizontalScrollBar()) jsp1.getHorizontalScrollBar().setValue(e.getValue()); if (e.getSource() == jsp2.getVerticalScrollBar()) jsp1.getVerticalScrollBar().setValue(e.getValue()); } }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
45 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
46 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
47 /146
Imagens Substitutas
Uso de imagens substitutas (surrogate images): Criamos uma imagem normalizada com pixels entre valores 0-255 Transformamos o tipo da imagem para bytes. Uma classe que herda de DisplayJAI pode executar estes passos.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
48 /146
Imagens Substitutas
public class DisplaySurrogateImage extends DisplayJAI { protected PlanarImage surrogateImage; protected int width,height; public DisplaySurrogateImage(PlanarImage image) { width = image.getWidth(); height = image.getHeight(); // Recuperamos valores extremos da imagem. ParameterBlock pbMaxMin = new ParameterBlock(); pbMaxMin.addSource(image); PlanarImage extrema = JAI.create("extrema", pbMaxMin); double[] allMins = (double[])extrema.getProperty("minimum"); double[] allMaxs = (double[])extrema.getProperty("maximum"); double minValue = allMins[0]; double maxValue = allMaxs[0]; for(int v=1;v<allMins.length;v++) { if (allMins[v] < minValue) minValue = allMins[v]; if (allMaxs[v] > maxValue) maxValue = allMaxs[v]; }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
49 /146
Imagens Substitutas
// Reescalamos os nveis de cinza da imagem. double[] subtract = new double[1]; subtract[0] = minValue; double[] multiplyBy = new double[1]; multiplyBy[0] = 255./(maxValue-minValue); ParameterBlock pbSub = new ParameterBlock(); pbSub.addSource(image); pbSub.add(subtract); surrogateImage = (PlanarImage)JAI.create("subtractconst",pbSub); ParameterBlock pbMult = new ParameterBlock(); pbMult.addSource(surrogateImage); pbMult.add(multiplyBy); surrogateImage = (PlanarImage)JAI.create("multiplyconst",pbMult); // Convertemos para bytes. ParameterBlock pbConvert = new ParameterBlock(); pbConvert.addSource(surrogateImage); pbConvert.add(DataBuffer.TYPE_BYTE); surrogateImage = JAI.create("format", pbConvert); // Usamos esta imagem para display. set(surrogateImage); } }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
50 /146
Imagens Substitutas
public class DemonstraDisplaySurrogateImage { public static void main(String[] args) { PlanarImage image = JAI.create("fileload", args[0]); JFrame frame = new JFrame("Mostrando "+args[0]); frame.getContentPane().add( new JScrollPane(new DisplaySurrogateImage(image))); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
51 /146
Uso de imagens substitutas (surrogate images) com LUTs: Look-up Tables (LUTs): tabela de cores.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 2 2 2 1 0 0 0 0 0 0 1 1 2 2 2 3 2 1 1 0 0 0 1 1 1 2 2 3 2 2 1 1 1 0 0 0 1 1 2 3 2 2 2 1 1 0 0 0 0 0 0 1 2 2 2 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ndice 0 1 2 3 R G B 1 0
0 124
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
52 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
53 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
55 /146
Desenhando em Imagens
As imagens so modificadas (na memria) e podem ser visualizadas e/ou armazenadas com os grficos.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
56 /146
Desenhando em Imagens
BufferedImagebaseImage=ImageIO.read(newFile("sjc_region.png")); int[][]coords=newint[][]{ {714,219}, {822,256}, {797,329}, {710,300}, {711,293}, {666,271}}; Path2D.FloatregionOfInterest=newPath2D.Float(); booleanisFirst=true; doublefirstX=0,firstY=0; for(int[]coord:coords) { intx=coord[0];inty=coord[1]; if(isFirst) { regionOfInterest.moveTo(x,y); firstX=x; firstY=y; isFirst=false; } else{regionOfInterest.lineTo(x,y);} } regionOfInterest.lineTo(firstX,firstY); Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 57 /146
Desenhando em Imagens
Path2D.FloatpathForWholeImage=newPath2D.Float(); pathForWholeImage.moveTo(0,0); pathForWholeImage.lineTo(baseImage.getWidth(),0); pathForWholeImage.lineTo(baseImage.getWidth(),baseImage.getHeight()); pathForWholeImage.lineTo(0,baseImage.getHeight()); pathForWholeImage.lineTo(0,0); AreawholeImage=newArea(pathForWholeImage); wholeImage.subtract(newArea(regionOfInterest)); Graphics2Dg2d=(Graphics2D)baseImage.getGraphics(); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(newColor(255,255,255,100)); g2d.fill(wholeImage); g2d.setStroke(newBasicStroke(5f)); g2d.setColor(newColor(255,0,0,200)); g2d.draw(regionOfInterest); JFrameframe=newJFrame("Highlightingimageregions"); ImageIconicon=newImageIcon(baseImage); JLabellabel=newJLabel(icon); frame.getContentPane().add(newJScrollPane(label)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack();frame.setVisible(true); Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 58 /146
Desenhando em Imagens
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
59 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
60 /146
Classe JAI prov mtodo create. Vrios operadores so registrados, chamados de forma unificada. Parmetros (se houver) so passados atravs de instncia de ParameterBlock. Mtodo retorna instncia de RenderedOp cast para PlanarImage se necessrio.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
61 /146
WritableRenderedImage
BufferedImage
ImageJAI
PlanarImage
RenderedOp
API JAI
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos
TiledImage
62 /146
Tipos com sinal: sada = -entrada Tipos sem sinal: sada = mximo - entrada
public static void main(String[] args) { PlanarImage input = JAI.create("fileload", args[0]); PlanarImage output = JAI.create("invert", input); JFrame frame = new JFrame(); frame.setTitle("Invert image "+args[0]); frame.getContentPane().add( new DisplayTwoSynchronizedImages(input,output)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
63 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
64 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
65 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
66 /146
public static void main(String[] args) { PlanarImage imagem = JAI.create("fileload", args[0]); float[] kernelMatrix = { 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f, 1f/25f}; KernelJAI kernel = new KernelJAI(5,5,kernelMatrix); PlanarImage bordas = JAI.create("convolve",imagem,kernel); JFrame frame = new JFrame("Suavizao da imagem"); frame.add(new DisplayTwoSynchronizedImages(imagem,bordas)); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
67 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
68 /146
public static void main(String[] args) { PlanarImage imagem = JAI.create("fileload", args[0]); float[] kernelMatrix = { -1, -2, -1, 0, 0, 0, 1, 2, 1 }; KernelJAI kernel = new KernelJAI(3,3,kernelMatrix); PlanarImage bordas = JAI.create("convolve",imagem,kernel); JFrame frame = new JFrame("Bordas horizontais"); frame.add(new DisplayTwoSynchronizedImages(imagem,bordas)); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
69 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
70 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
71 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
73 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
75 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
76 /146
Regio recortada
Mnimo 200,200 Tamanho 400x300 Mximo 600,500
Fevereiro/2010
Recorte e translao
http://www.lac.inpe.br/~rafael.santos
77 /146
DisplayJAI, ImageIO e JAI.create(filestore) no. Soluo: mover a origem da imagem com o operador translate.
public static void main(String[] args) { PlanarImage imagem = JAI.create("fileload",args[0]); float angle = (float)Math.toRadians(45); // Usamos o centro da imagem para rotao float centerX = imagem.getWidth()/2f; float centerY = imagem.getHeight()/2f; ParameterBlock pb = new ParameterBlock(); pb.addSource(imagem); pb.add(centerX); pb.add(centerY); pb.add(angle); pb.add(new InterpolationBilinear()); PlanarImage rotacionada = JAI.create("rotate", pb);
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 78 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
79 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
80 /146
public static void main(String[] args) { PlanarImage imagem = JAI.create("fileload",args[0]); float scale = 0.3f; ParameterBlock pb = new ParameterBlock(); pb.addSource(imagem); pb.add(scale); pb.add(scale); pb.add(0.0F); pb.add(0.0F); pb.add(new InterpolationNearest()); PlanarImage reescalada = JAI.create("scale", pb); JFrame frame = new JFrame("Imagem reescalada"); frame.add(new DisplayTwoSynchronizedImages(imagem,reescalada)); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 81 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
82 /146
Pequena aplicao que recorta e amplia uma regio em uma imagem. Parmetros passados pela linha de comando.
public static void main(String[] args) { PlanarImage imagem = JAI.create("fileload",args[0]); ParameterBlock pb = new ParameterBlock(); float x = Float.parseFloat(args[1]); float y = Float.parseFloat(args[2]); float w = Float.parseFloat(args[3]); float h = Float.parseFloat(args[4]); float z = Float.parseFloat(args[5]);
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
83 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
84 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
85 /146
public static void main(String[] args) { PlanarImage image = JAI.create("fileload", args[0]); // Primeiro histograma com 256 bins. ParameterBlock pb1 = new ParameterBlock(); pb1.addSource(image); pb1.add(null); pb1.add(1); pb1.add(1); pb1.add(new int[]{256}); pb1.add(new double[]{0}); pb1.add(new double[]{256}); PlanarImage dummyImage1 = JAI.create("histogram", pb1); Histogram histo1 = (Histogram)dummyImage1.getProperty("histogram");
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 87 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
89 /146
Alguns satlites tem bandas com resolues diferentes. Podemos usar combinaes de bandas (cores e pancromticas) para obter melhor resoluo espacial.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
90 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
91 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
92 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
94 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
95 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
96 /146
SourcelessOpImage: operadores sem imagens de entrada. PointOpImage: pixels da sada dependem dos mesmos pixels da entrada. AreaOpImage: pixels da sada dependem de rea ao redor dos da entrada. GeometricOpImage: pixels da sada podem depender de todos da entrada. StatisticsOpImage: operadores que calculam estatsticas sobre imagem de entrada.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
97 /146
Criando Novos Operadores Receita de bolo (relativamente) simples para imagens renderizadas. 1. Criar classe que herda de XXXOpImage.
Como XXXOpImage abstrata, devemos implementar mtodos que fazem o processamento (quase sempre computeTile).
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
98 /146
Criando Novos Operadores 3. Criar classe que implementa OperationDescriptor ou herda de OperationDescriptorImpl, que descreve os parmetros e valores default do operador. 4. Registrar o novo operador junto ao OperationRegistry e RIFRegistry (podemos criar mtodo para registro na classe do passo anterior).
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
99 /146
Segmentador por limiar semelhante a binarize, mas com 2 limiares. Classe que herda de PointOpImage.
public class Segmenta3OpImage extends PointOpImage { private RenderedImage source; private int threshold1,threshold2;
Passo 1
public Segmenta3OpImage(RenderedImage source,int th1,int th2, ImageLayout layout,RenderingHints hints, boolean b) { super(source,layout,hints,b); this.source = source; this.threshold1 = th1; this.threshold2 = th2; }
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 100 /146
Passo 1
101 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
102 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
103 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
104 /146
Passo 3/4
public static void register() { if (!registered) { OperationRegistry op = JAI.getDefaultInstance().getOperationRegistry(); Segmenta3Descriptor desc = new Segmenta3Descriptor(); op.registerDescriptor(desc); Segmenta3RIF rif = new Segmenta3RIF(); RIFRegistry.register(op,opName,vendorName,rif); registered = true; } }
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
105 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
106 /146
Conta nmero de pixels com cor semelhante a um parmetro (com tolerncia). Classe que herda de StatisticsOpImage.
Contm construtor para inicializar atributos e vrios mtodos para acumular estatsticas.
public class ContaPixelsOpImage extends StatisticsOpImage { private Color target; private Float tolerance; private Long count;
Passo 1
public ContaPixelsOpImage(RenderedImage source, Color target,Float tolerance) { super(source,null,source.getMinX(),source.getMinY(),1,1); this.target = target; this.tolerance = tolerance; count = null; }
Fevereiro/2010 http://www.lac.inpe.br/~rafael.santos 107 /146
Passo 1
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
109 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
110 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
111 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
112 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
113 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
114 /146
Extras: I/O
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
115 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
116 /146
Compactando Imagens
Forma mais simples: abrir imagem em formato menos compactado e salvar em formato mais compactado. Lembrar sempre que existe perda de informaes com JPEG e GIF! Mtodo mais inteligente: controlar a compactao.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
117 /146
Original
0.5
0.1
Extras: Pixels
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
121 /146
Intensity: brilho percebido da cor, 0 a 100% (preto = 0%). Hue (croma): cor bruta, 0 a 359 graus (0 graus = vermelho). Saturation: intensidade da cor, 0 a 100% (branco = 100%).
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
122 /146
RGB IHS, substitui banda I por banda de maior resoluo, converte novamente IHS RGB RGB IHS, manipula brilho e contraste da banda I, converte novamente IHS RGB
Nosso exemplo: converte RGB IHS, substitui I e S por 100% constantes, reconverte para RGB.
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
123 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
124 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
125 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
126 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
127 /146
Extras: Display
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
128 /146
public class DisplayThumbnail extends DisplayJAI implements MouseMotionListener,MouseListener { private PlanarImage originalImage; private float scale; private int imageXTiles,imageYTiles; private int imageTileWidth,imageTileHeight; private int imageWidth,imageHeight; private int visibleRegionWidth,visibleRegionHeight; private int thumbWidth,thumbHeight; // The size of the border around the thumbnail. private final int border = 10; // The scaled viewport (dimensions are scaled/translated by the border). private Rectangle2D scaledViewport; private Color viewportColor; // Colors to be used when the mouse is/isn't over the viewport. private static Color viewportOn = new Color(120,255,120); private static Color viewportOff = new Color(0,192,0); // Coordinates obtained when we click (press) the mouse button to start // dragging the viewport. private int lastX,lastY; // Those coordinates represent the region where we can safely drag the // viewport without "falling outside" the image boundaries. private int minValidX,minValidY,maxValidX,maxValidY;
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
129 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
130 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
131 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
132 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
133 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
134 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
136 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
137 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
138 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
139 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
140 /146
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
141 /146
Outros Tpicos
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
142 /146
Imagens de alta resoluo Novos algoritmos de classificao Modelagem de conhecimento Modelos de mistura Inteligncia artificial
http://gras.ku.dk/software/ecognition.htm
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
143 /146
http://www.lac.inpe.br/JIPCookbook http://www.lac.inpe.br/~rafael.santos Introductory Digital Image Processing: A Remote Sensing Perspective (John R. Jensen) Digital Image Processing Algorithms and Applications (Ioannis Pitas) Digital Image Processing (Rafael C. Gonzalez, Richard E. Woods)
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
144 /146
Fundamentals of Digital Image Processing (Anil K. Jain) Classification Methods for Remotely Sensed Data (Brandt Tso, Paul M. Mather) Pattern Recognition and Image Analysis (Earl Gose, Richard Johnsonbaugh, Steve Jost)
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
145 /146
Fuzzy Algorithms: With Applications to Image Processing and Pattern Recognition (Zheru Chi, H. Yan, Z.R. Chi, Hong Yan, Tuan Pham) The Pocket Handbook of Image Processing Algorithms In C (Harley R. Myler, Arthur R. Weeks) Intelligence: The Eye, the Brain, and the Computer (Martin A. Fischler, Oscar Firschein)
Fevereiro/2010
http://www.lac.inpe.br/~rafael.santos
146 /146