classifying multi-spectral images using Advanced Weka Segmaentation

Posted by Dionysios Lefkaditis on
URL: http://imagej.273.s1.nabble.com/classifying-multi-spectral-images-using-Advanced-Weka-Segmaentation-tp5002444.html

Hello everyone,

I am trying to classify/segment multi-spectral images. The original images are in multi-layer tiff format. I am computing a set of features for every slice/band and then adding it to a custom featureStack, so that the final feature vector is a collection of varying features coming from each of the spectral bands. I can successfully build the featurestack and train the classifier. However, when the classifier is applied to a test image, it seems that it classifies each band/slice separately. It is intended to treat each multi-sepctral image as one entity and thus produce a single slice classified image. As I am a newbe on Fiji's API and the javadoc site is currently down, I would greatly appreciate your input on this. I am also wandering how it would be possible to just apply such a classifier to other unseen images. How do I recompute the feature vector and feed it straight to the classifier?

thanks a bunch,
Dionysios

I am sorry to clutter my post with a long script:

import ij.*;
import ij.process.*;
import trainableSegmentation.*;
import hr.irb.fastRandomForest.*;
 
// training input image (it could be a stack or a single 2D image)
opener = new Opener();
image = opener.openImage("/home/dionysis/fermi/media/data/CNH/cnh_multispectral/Denmark_field_1/original images/15/multi-spectral.tif");
//IJ.run(image, "8-bit", "");
IJ.run(image, "32-bit", "");



//*** Custom features***

-----------------------------------



// the FeatureStackArray contains a FeatureStack for every slice in our original image
featuresArray = new FeatureStackArray(1, 1, 16, false, 1, 19, null);

customstack = new ImageStack(image.getWidth(), image.getHeight());
for (slice = 1; slice <= image.getStackSize(); slice++) {
        image.setSlice(slice);
       
        features = new FeatureStack(image.getProcessor().duplicate());
        features.addGaussianBlur(20);
        features.addLaplacian(5);
        features.addHessian(2);
        //features.show();

       
        customstack.addSlice("original "+slice, features.getProcessor(1));
        customstack.addSlice("gaussianstd "+slice, features.getProcessor(2));
        customstack.addSlice("Laplacianstd "+slice, features.getProcessor(3));
       
}

//customFeaturesImage = new ImagePlus("features_std&cust", customstack);
//customFeaturesImage.show();



// create new feature stack with the custom features
stack2featstack = new FeatureStack( image );
stack2featstack.setStack( customstack );
stack2featstack.show();
//print(stack2featstack.getSize());



// create Weka segmentator
seg = new WekaSegmentation(image);
 
// number of samples to use per slice
nSamplesToUse = 1000;
 
 
// Classifier
// In this case we use a Fast Random Forest
rf = new FastRandomForest();
// Number of trees in the forest
rf.setNumTrees(100);      
// Number of features per tree
rf.setNumFeatures(0);
// Seed
rf.setSeed( (new java.util.Random()).nextInt() );
 
// set classifier
seg.setClassifier(rf);

//Set feature stack array to the weka segmentation object
featuresArray.set(stack2featstack, 0);
seg.setFeatureStackArray(featuresArray);


// corresponding binary labels
labels = IJ.openImage("/home/dionysis/fermi/media/data/CNH/cnh_multispectral/Denmark_field_1/original images/15/MOG.bmp");
labelstack = new ImageStack(labels.getWidth(), labels.getHeight());
for (slice = 1; slice <= image.getStackSize(); slice++) {
        labelstack.addSlice("MOG "+slice, labels.getProcessor().duplicate());
}
labelstackimage = new ImagePlus("Labels_std&cust", labelstack);
labelstackimage.show();



// Add (balanced) labels
seg.addRandomBalancedBinaryData(image, labelstackimage, "class 2", "class 1", nSamplesToUse);
//seg.addBinaryData(image, labels, "class 2", "class 1");


// Train classifier
seg.trainClassifier();

//save Classifier
seg.saveClassifier("/home/dionysis/Desktop/testclassifier.model");
 

// Open test image
image = IJ.openImage("/home/dionysis/fermi/media/data/CNH/cnh_multispectral/Denmark_field_1/original images/15/multi-spectral.tif");
IJ.run(image, "32-bit", "");
IJ.log("Test image loaded");
// Apply trained classifier to test image and get probabilities
prob = seg.applyClassifier(image, 0, true );
IJ.log("Classifier applied");
 
// Display results
prob.setTitle( "Probability maps of test image" );
IJ.log("Showing results");
prob.show();

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html