package ml.humaning.util;
import ij.IJ;
import ij.ImagePlus;
import ij.io.FileInfo;
import ij.measure.Measurements;
import ij.measure.ResultsTable;
import ij.plugin.filter.Analyzer;
import ij.process.ColorProcessor;
import ij.process.FloatProcessor;
import ij.process.ImageProcessor;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.List;
import javax.imageio.ImageIO;
import de.lmu.ifi.dbs.jfeaturelib.LibProperties;
import de.lmu.ifi.dbs.jfeaturelib.edgeDetector.Canny;
import de.lmu.ifi.dbs.jfeaturelib.features.CEDD;
import de.lmu.ifi.dbs.jfeaturelib.features.FCTH;
import de.lmu.ifi.dbs.jfeaturelib.features.FuzzyHistogram;
import de.lmu.ifi.dbs.jfeaturelib.features.Gabor;
import de.lmu.ifi.dbs.jfeaturelib.features.Haralick;
import de.lmu.ifi.dbs.jfeaturelib.features.Histogram;
import de.lmu.ifi.dbs.jfeaturelib.features.JpegCoefficientHistogram;
import de.lmu.ifi.dbs.jfeaturelib.features.LocalBinaryPatterns;
import de.lmu.ifi.dbs.jfeaturelib.features.LuminanceLayout;
import de.lmu.ifi.dbs.jfeaturelib.features.MPEG7EdgeHistogram;
import de.lmu.ifi.dbs.jfeaturelib.features.MeanIntensityLocalBinaryPatterns;
import de.lmu.ifi.dbs.jfeaturelib.features.MeanPatchIntensityHistogram;
import de.lmu.ifi.dbs.jfeaturelib.features.Moments;
import de.lmu.ifi.dbs.jfeaturelib.features.OpponentHistogram;
import de.lmu.ifi.dbs.jfeaturelib.features.PHOG;
import de.lmu.ifi.dbs.jfeaturelib.features.ReferenceColorSimilarity;
import de.lmu.ifi.dbs.jfeaturelib.features.SURF;
import de.lmu.ifi.dbs.jfeaturelib.features.Sift;
import de.lmu.ifi.dbs.jfeaturelib.features.Tamura;
import de.lmu.ifi.dbs.jfeaturelib.features.Thumbnail;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.AdaptiveGridResolution;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.CentroidFeature;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.Eccentricity;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.ExtremalPoints;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.PolygonEvolution;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.Profiles;
import de.lmu.ifi.dbs.jfeaturelib.shapeFeatures.SquareModelShapeMatrix;
import de.lmu.ifi.dbs.utilities.Arrays2;
public class ImageFeatureExtractor {
Point [] allData;
int [] measurementArray ;
public void saveAllPoints(){
for(int i = 0;i < allData.length;i++){
savePoint(i, "image"+i+".tif");
}
}
public void savePoint(int index, String name){
FloatProcessor fp = new FloatProcessor(allData[index].getFloatArray());
fp.invert();
ImagePlus imp = new ImagePlus("test.tif", fp);
IJ.saveAs(imp, "tif", name);
}
public void analyze(int index){
FloatProcessor fp = new FloatProcessor(allData[index].getFloatArray());
fp.invert();
ImagePlus imp = new ImagePlus("test.tif", fp);
for (int measurement : measurementArray){
ResultsTable rt = new ResultsTable();
Analyzer analyzer = new Analyzer(imp, measurement, rt);
analyzer.measure();
analyzer.displayResults();
}
}
public static void doCrop(String trainFile) throws IOException{
Point [] allData = Reader.readPoints(trainFile);
FloatProcessor fp = new FloatProcessor(allData[0].getFloatArray());
fp.invert();
//fp = (FloatProcessor) fp.crop();
fp.scale(0.2, 0.2);
ImagePlus imp = new ImagePlus("test.tif", fp);
IJ.saveAs(imp, "tif", "image.tif");
}
public static void addFeature(int maxDimension, String inputFile, String outputFile) throws IOException{
BufferedReader br = new BufferedReader(new FileReader(inputFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
Point [] data = Reader.readPoints(inputFile);
for(int i = 0;i < data.length;i++){
int extremeDimension = maxDimension;
FloatProcessor fp = new FloatProcessor(data[i].getFloatArray());
fp.invert();
ImagePlus imp = new ImagePlus("test.tif", fp);
String record = data[i].toLIBSVMString()+" ";
ResultsTable rt = new ResultsTable();
rt = new ResultsTable();
// Analyzer analyzer = new Analyzer(imp, Measurements.INTEGRATED_DENSITY, rt);
// analyzer.measure();
// record += (++extremeDimension)+":"+rt.getValue("RawIntDen", 0)+ " ";
// rt = new ResultsTable();
// Analyzer analyzer = new Analyzer(imp, Measurements.KURTOSIS, rt);
// analyzer.measure();
// record += (++extremeDimension)+":"+rt.getValue("Kurt", 0)+ " ";
rt = new ResultsTable();
Analyzer analyzer = new Analyzer(imp, Measurements.SKEWNESS, rt);
analyzer.measure();
record += (++extremeDimension)+":"+rt.getValue("Skew", 0)+ " ";
bw.write(record.trim()+"\n");
}
br.close();
bw.close();
}
public static void featureExtract(String inputFile, String outputFile) throws URISyntaxException, IOException{
Point [] allData = Reader.readPoints(inputFile);
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
for(int i = 0;i < allData.length;i++){
FloatProcessor fp = new FloatProcessor(allData[i].getFloatArray());
fp.invert();
//ImagePlus imp = new ImagePlus("test.jpg", fp);
//IJ.saveAs(imp, "jpg", "image"+i+".jpg");
//File f = new File("image"+i+".jpg");
//ColorProcessor image = new FloatProcessor(ImageIO.read(f));
//System.out.println(fp.getMask());
//fp.setMask(new ImageProcessor());
// LibProperties prop = LibProperties.get();
// prop.setProperty(LibProperties.HISTOGRAMS_BINS, 225);
// prop.setProperty(LibProperties.HISTOGRAMS_TYPE, "Gray");
// after v 1.0.1 you will be able to use this:
// prop.setProperty(LibProperties.HISTOGRAMS_TYPE, Histogram.TYPE.Red.name());
// initialize the descriptor, set the properties and run it
AdaptiveGridResolution descriptor = new AdaptiveGridResolution(50);
//descriptor.setProperties(prop);
//Histogram descriptor = new Histogram() ;
//descritor.setProperties(LibProperties properties);
//descriptor.setNeighborhoodSize(8);
//descriptor.setNumberOfHistogramBins(3);
// run the descriptor and extract the features
descriptor.run(fp);
// obtain the features
List<double[]> features = descriptor.getFeatures();
// print the features to system out
String record = allData[i].getZodiac() + " ";
int index = 1;
for (double[] feature : features) {
for(double d : feature){
record += (index++)+":"+d+" ";
}
//record += System.out.println(Arrays2.join(feature, ", ", "%.5f"));
}
bw.write(record.trim()+"\n");
//f.delete();
}
bw.close();
// initialize the descriptor
}
public void extractFeature(String outputFile) throws IOException{
BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));
for(int i = 0;i < allData.length;i++){
FloatProcessor fp = new FloatProcessor(allData[i].getFloatArray());
fp.invert();
ImagePlus imp = new ImagePlus("test.tif", fp);
int index = 1;
String record = allData[i].getZodiac() + " ";
ResultsTable rt = new ResultsTable();
Analyzer analyzer = new Analyzer(imp, Measurements.INTEGRATED_DENSITY, rt);
analyzer.measure();
record += (index++)+":"+rt.getValue("RawIntDen", 0)+ " ";
rt = new ResultsTable();
analyzer = new Analyzer(imp, Measurements.KURTOSIS, rt);
analyzer.measure();
record += (index++)+":"+rt.getValue("Kurt", 0)+ " ";
rt = new ResultsTable();
analyzer = new Analyzer(imp, Measurements.SKEWNESS, rt);
analyzer.measure();
record += (index++)+":"+rt.getValue("Skew", 0)+ " ";
bw.write(record.trim()+"\n");
}
bw.close();
}
public ImageFeatureExtractor(String trainFileInLibsvmFormat){
try {
allData = Reader.readPoints(trainFileInLibsvmFormat);
measurementArray = new int[]{Measurements.ADD_TO_OVERLAY
,Measurements.AREA
,Measurements.AREA_FRACTION
,Measurements.CENTER_OF_MASS
,Measurements.CENTROID
,Measurements.CIRCULARITY
,Measurements.ELLIPSE
,Measurements.FERET
,Measurements.INTEGRATED_DENSITY
,Measurements.INVERT_Y
,Measurements.KURTOSIS
,Measurements.LABELS
,Measurements.LIMIT
,Measurements.MAX_STANDARDS
,Measurements.MEAN
,Measurements.MEDIAN
,Measurements.MIN_MAX
,Measurements.MODE
,Measurements.PERIMETER
,Measurements.RECT
,Measurements.SCIENTIFIC_NOTATION
,Measurements.SHAPE_DESCRIPTORS
,Measurements.SKEWNESS
,Measurements.SLICE
,Measurements.STACK_POSITION
,Measurements.STD_DEV};
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}