package fr.unistra.pelican.algorithms.segmentation;
import fr.unistra.pelican.Algorithm;
import fr.unistra.pelican.AlgorithmException;
import fr.unistra.pelican.Image;
/**
* Evaluate a segmentation given a expert segmentation. The expert segmentation
* can be multi-band.
* @author Sebastien Derivaux
*/
public class EvalClassification extends Algorithm {
public static boolean info = false;
/*
* Input Image
*/
public Image input;
/*
* Epert Image
*/
public Image expert;
/*
* Result
*/
public double result;
/**
* Constructor
*
*/
public EvalClassification() {
super();
super.inputs = "input,expert";
super.outputs = "result";
}
/*
* (non-Javadoc)
*
* @see fr.unistra.pelican.Algorithm#launch()
*/
public void launch() throws AlgorithmException {
int xDim = input.getXDim();
int yDim = input.getYDim();
int nbClasses = expert.getBDim();
// Correlation matrix creation
int correlation[][] = new int[nbClasses][];
for (int i = 0; i < correlation.length; i++) {
correlation[i] = new int[nbClasses + 1];
}
// Parse expert data
int total = 0;
int diag = 0;
int reject = 0;
int[] perClasses = new int[nbClasses];
for (int x = 0; x < xDim; x++)
for (int y = 0; y < yDim; y++)
for (int c = 0; c < nbClasses; c++)
if (expert.getPixelXYBBoolean(x, y, c)) {
perClasses[c]++;
int label = input.getPixelInt(x, y, 0, 0, 0);
if (label == -1) {
correlation[c][nbClasses]++;
reject++;
} else
correlation[c][label]++;
if (c == label)
diag++;
total++;
}
if (info) {
System.out.println("Correlation Matrix\n==================");
for (int i = 0; i < correlation.length; i++) {
int[] local = correlation[i];
for (int j = 0; j < local.length; j++)
System.out.print(intToString(local[j] * 100 / total, 5));
System.out.println("");
}
}
double accuracy = 0.0;
for (int i = 0; i < nbClasses; i++)
accuracy += (double) correlation[i][i] / (double) perClasses[i];
accuracy = accuracy / (double) nbClasses * 100.0;
// System.out.println("Correctly Classified Pixels " + accuracy + "%");
result = accuracy;
}
public String intToString(int num, int width) {
String numstr = Integer.toString(num);
while (numstr.length() < width)
numstr = " " + numstr;
return numstr;
}
/**
* Evaluate a segmentation
*/
public double exec(Image input, Image expert){
return (Double)new EvalClassification().process(input, expert);
}
/*
public static void main(String[] args) {
String file = "./samples/remotesensing1";
if (args.length > 0)
file = args[0];
BooleanImage se3 = FlatStructuringElement2D
.createSquareFlatStructuringElement(3);
try {
// Load the image
Image source = (Image) new ImageLoader().process(file + ".png");
Image samples = (Image) new SamplesLoader().process(file);
Image regions = (Image) new RegionsLoader().process(file);
// Create regions
Image result = (Image) new WekaClassification5NN().process(source, samples);
// View it
new Viewer2D().process(new DrawFrontiersOnImage().process(source,
new FrontiersFromSegmentation().process(result)),
"Segmentation of " + file);
System.out.println(new EvalClassification().process(result, regions));
} catch (InvalidTypeOfParameterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (AlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvalidNumberOfParametersException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}