package fr.unistra.pelican.demos.applied.remotesensing;
import java.util.ArrayList;
import java.util.Arrays;
import fr.unistra.pelican.ByteImage;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.algorithms.applied.remotesensing.index.NDVI;
import fr.unistra.pelican.algorithms.conversion.AverageChannels;
import fr.unistra.pelican.algorithms.io.ImageBuilder;
import fr.unistra.pelican.algorithms.io.ImageLoader;
public class ExtractPropertiesDemo {
public static void main(String[] args) {
// chargement et affichage pour sᅵlection des zones
String path = "/home/miv/lefevre/data/teledetection/ecosgil/thrs/";
String respath = "/home/miv/lefevre/data/teledetection/ecosgil/thrs/";
String filepath = path + "VillervilleQB2_4.hdr";
Image source = ImageLoader.exec(filepath);
source=addBands(source);
Image bg = ImageLoader.exec(respath + "input.png");
ArrayList<Object> params = new ImageBuilder().processAll(bg,
"select a zone to get its properties");
Image markers = (Image) params.get(0);
// Viewer2D.exec(markers);
int labels = 1 + (Integer) params.get(1);
int bands = source.getBDim();
// calcul des statistiques : min,max,average,std dans chaque bande
int min[][] = new int[labels][bands];
int max[][] = new int[labels][bands];
for (int l = 0; l < labels; l++)
Arrays.fill(min[l], 255);
double avg[][] = new double[labels][bands];
double std[][] = new double[labels][bands];
int sum[][] = new int[labels][bands];
int sum2[][] = new int[labels][bands];
int count[] = new int[labels];
for (int x = 0; x < markers.getXDim(); x++)
for (int y = 0; y < markers.getYDim(); y++) {
int label = markers.getPixelXYByte(x, y);
count[label]++;
for (int b = 0; b < bands; b++) {
int val = source.getPixelXYBByte(x, y, b);
sum[label][b] += val;
sum2[label][b] += val * val;
if (val < min[label][b])
min[label][b] = val;
if (val > max[label][b])
max[label][b] = val;
}
}
for (int b = 0; b < bands; b++)
for (int l = 0; l < labels; l++) {
avg[l][b] = ((double) sum[l][b]) / count[l];
std[l][b] = sum2[l][b] + count[l] * avg[l][b] * avg[l][b] - 2
* avg[l][b] * sum[l][b];
}
for (int l = 0; l < labels; l++) {
System.out.println("label: " + l + "\t #=" + count[l]);
for (int b = 0; b < bands; b++) {
System.out.print(" band: " + b);
System.out.print("\t min=" + min[l][b]);
System.out.print("\t max=" + max[l][b]);
System.out.print("\t avg=" + ((int) (100 * avg[l][b])) / 100.0);
System.out.print("\t std=" + ((int) (std[l][b])) / 100.0);
System.out.println();
}
System.out.println();
}
}
public static Image addBands(Image sat) {
Image ndvi = NDVI.exec(sat, 2, 3);
Image pan = AverageChannels.exec(sat);
Image sat2 = new ByteImage(sat.getXDim(), sat.getYDim(), 1, 1, sat
.getBDim() + 2);
sat2.setImage4D(sat.getImage4D(0, Image.B), 0, Image.B);
sat2.setImage4D(sat.getImage4D(1, Image.B), 1, Image.B);
sat2.setImage4D(sat.getImage4D(2, Image.B), 2, Image.B);
sat2.setImage4D(sat.getImage4D(3, Image.B), 3, Image.B);
sat2.setImage4D(ndvi.getImage4D(0, Image.B), 4, Image.B);
sat2.setImage4D(pan.getImage4D(0, Image.B), 5, Image.B);
return sat2;
}
}