E ai galerinha do guj,
bom, estou fazendo um programa que faz segmentação na imagem, afim de encontrar zona urbana, destacando-a em vermelho, utilizando as ferramentas do JAI. Para fazer esse tipo de segmentação, preciso utilizar 3 imagens com uma banda diferente da outra, ou seja, banda 2, banda 3 e banda 4. Melhor explicando:
[quote]Imagem 1 -> banda 2 -> verde
Imagem 2 -> banda 3 -> vermelho
Imagem 3 -> banda 4 -> infra-vermelho[/quote]
Ate ai blz … o problema é que nao estou conseguindo fazer a segmentação. Gostaria muito da ajuda de vocês. Lembrando que para identificação de zonas urbanas, de acordo com minhas pesquisas, tem que utilizar banda 2, 3 e 4 e que os pixels de cada banda tem que estar entre:
Segue o código abaixo (B1 é banda 2, B2 é banda 3 e B3 é banda 4):
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.media.jai.iterator.RandomIter;
import javax.swing.JOptionPane;
import chamadas.ClasseMae;
public class Segmentacao {
ClasseMae cm = new ClasseMae();
private int ImgBanda1[][][], ImgBanda2[][][], ImgBanda3[][][];
private int heightB1, widthB1, heightB2, widthB2, heightB3, widthB3, nbandsB1, nbandsB2, nbandsB3, w, h;
private RandomIter iteratorB1, iteratorB2, iteratorB3;
private WritableRaster rasterB1, rasterB2, rasterB3;
private int[] pixelB1, pixelB2, pixelB3;
private BufferedImage imageB1, imageB2, imageB3;
public Segmentacao(int flag) {
//retorna altura e largura da imagem da banda 1
heightB1 = cm.getHeightB1();
widthB1 = cm.getWidthB1();
//retorna altura e largura da imagem da banda 2
heightB2 = cm.getHeightB2();
widthB2 = cm.getWidthB2();
//retorna altura e largura da imagem da banda 3
heightB3 = cm.getHeightB3();
widthB3 = cm.getWidthB3();
iteratorB1 = cm.getIteratorB1();
iteratorB2 = cm.getIteratorB2();
iteratorB3 = cm.getIteratorB3();
rasterB1 = cm.getRasterB1();
rasterB2 = cm.getRasterB2();
rasterB3 = cm.getRasterB3();
//retorna o numero de bandas de cada imagem
nbandsB1 = cm.getNumBandsB1();
nbandsB2 = cm.getNumBandsB2();
nbandsB3 = cm.getNumBandsB3();
imageB1 = cm.getBufImageB1();
imageB2 = cm.getBufImageB2();
imageB3 = cm.getBufImageB3();
pixelB1 = new int[nbandsB1];
pixelB2 = new int[nbandsB2];
pixelB3 = new int[nbandsB3];
//aqui dá erro (erro: Java heap space)
ImgBanda1 = new int[heightB1][widthB1][1];
ImgBanda2 = new int[heightB2][widthB2][1];
ImgBanda3 = new int[heightB3][widthB3][1];
segUrbana();
}
public void segUrbana() {
for(h=0; h<heightB1; h++) {
for(w=0; w<widthB1; w++) {
ImgBanda1[h][w][1] = pixelB1[1]; //verde
ImgBanda2[h][w][0] = pixelB2[0]; //vermelho
// ImgBanda3[h][w][1] = pixelB3[1]; //infra-vermelha ?? como faz pra identificar infra-vermelho ?
if(ImgBanda1[h][w][1] > 45 && ImgBanda1[h][w][1] < 183 && ImgBanda2[h][w][0] > 35 && ImgBanda2[h][w][0] < 186 && ImgBanda3[h][w][1] > 50
&& ImgBanda3[h][w][1] < 204) {
pixelB1[0] = 255; //destaca a zona urbana em vermelho
pixelB1[1] = 0;
pixelB1[2] = 0;
}
else {
pixelB1[0] = 0;
pixelB1[1] = 0;
pixelB1[2] = 0;
}
rasterB1.getPixel(w, h, pixelB1);
}
}
try {
ImageIO.write(imageB1, "JPG", new File("./TempImage/urbana.jpg"));
} catch(IOException e) {
JOptionPane.showMessageDialog(null, "Erro de gravação na imagem temporária");
}
}