Segmentação de imagens para identificação de Zona Urbana (JAI)

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");
		}
	}