@Override public BlockHistogramModel clone() { BlockHistogramModel model = new BlockHistogramModel(blocks_x, blocks_x, dims); model.histograms = new MultidimensionalHistogram[blocks_y][blocks_x]; for (int y=0; y<blocks_y; y++) for (int x=0; x<blocks_x; x++) model.histograms[y][x] = histograms[y][x].clone(); return model; }
/** * Construct with the given number of bins per dimension * * @param nbins * the number of bins in each dimension for the histograms */ public HistogramModel(int... nbins) { super(nbins.length); assert (nbins.length > 0); histogram = new MultidimensionalHistogram(nbins); }
/** * For a given index, get the average colour which would map to it * * @param index * @return start/end colour */ public float[] colourAverage(int index) { final int[] coord = this.histogram.getCoordinates(index); final float[] average = new float[coord.length]; final int[] nbins = histogram.nbins; for (int i = 0; i < coord.length; i++) { final float start = (float) coord[i] / (float) nbins[i]; final float end = ((float) coord[i] + 1) / nbins[i]; average[i] = (start + end) / 2f; } return average; }
double max = 0.0; int max_i = 0; double[] vec = model.getFeatureVector().asDoubleVector(); for( int i = 0; i < vec.length; i++ ) { if( vec[i] > max ) {
/** * Main method * * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // Load the image final URL[] imageURLs = new URL[] { new URL("http://openimaj.org/tutorial/figs/hist1.jpg"), new URL("http://openimaj.org/tutorial/figs/hist2.jpg"), new URL("http://openimaj.org/tutorial/figs/hist3.jpg") }; final List<MultidimensionalHistogram> histograms = new ArrayList<MultidimensionalHistogram>(); final HistogramModel model = new HistogramModel(4, 4, 4); for (final URL u : imageURLs) { model.estimateModel(ImageUtilities.readMBF(u)); histograms.add(model.histogram.clone()); } for (int i = 0; i < histograms.size(); i++) { for (int j = i; j < histograms.size(); j++) { final double distance = histograms.get(i).compare(histograms.get(j), DoubleFVComparison.EUCLIDEAN); System.out.println(distance); } } } }
Float[][] buildBinCols(MultidimensionalHistogram feature) { Float[][] binCols = new Float[10*4*1][]; double maxFeature = feature.max(); if(maxFeature == 0) maxFeature = 1; for (int k=0; k<10; k++) { for (int j=0; j<4; j++) { float s = (float)j/4 + (0.5f/4); float h = (float)k/10 + (0.5f/10); MBFImage img = new MBFImage(1,1,ColourSpace.HSV); img.setPixel(0, 0, new Float[] {h,s,(float) (feature.get(k,j,0) / maxFeature)}); // img.setPixel(0, 0, new Float[] {h,s,1f}); img = Transforms.HSV_TO_RGB(img); binCols[j* 10 + k] = img.getPixel(0, 0); } } return binCols; }
@Override public float classifyPatch(MBFImage patch) { HistogramModel h = new HistogramModel(model.histogram.nbins); h.estimateModel(patch); return (float) model.histogram.compare(h.histogram, compare); }
@Override public void analyseImage(MBFImage image) { Transforms.calculateIntensityNTSC(image).analyseWith(extractor); final FImage mask = extractor.getROIMap().inverse(); final MaskingHistogramModel hm = new MaskingHistogramModel(mask, binsPerBand, binsPerBand, binsPerBand); hm.estimateModel(image); final MultidimensionalHistogram fv = hm.getFeatureVector(); final double thresh = gamma * fv.max(); int count = 0; for (final double f : fv.values) { if (f >= thresh) count++; } simplicity = (double) count / (double) fv.values.length; }
@Override public void estimateModel(MBFImage... images) { reset(); for (final MBFImage im : images) { accum(im); } histogram.normalise(); }
static DoubleFV extractFeature(MBFImage image) { final HistogramModel model = new HistogramModel(4, 4, 4); model.estimateModel(image); return model.histogram.normaliseFV(); } }
double max = 0.0; int max_i = 0; double[] vec = model.getFeatureVector().asDoubleVector(); for( int i = 0; i < vec.length; i++ ) { if( vec[i] > max ) {
@Override public void analyseImage(FImage image) { final BlockHistogramModel hm = new BlockHistogramModel(2, 1, nbins); hm.estimateModel(image); final MultidimensionalHistogram left = hm.histograms[0][0]; final MultidimensionalHistogram right = hm.histograms[0][1]; balance = left.compare(right, DoubleFVComparison.CHI_SQUARE); } }
@Override public void analyseImage(MBFImage image) { Transforms.calculateIntensityNTSC(image).analyseWith(extractor); final FImage mask = extractor.getROIMap().inverse(); final MaskingHistogramModel hm = new MaskingHistogramModel(mask, binsPerBand, binsPerBand, binsPerBand); hm.estimateModel(image); final MultidimensionalHistogram fv = hm.getFeatureVector(); final double thresh = gamma * fv.max(); int count = 0; for (final double f : fv.values) { if (f >= thresh) count++; } simplicity = (double) count / (double) fv.values.length; }
@Override public void estimateModel(MBFImage... images) { reset(); for (final MBFImage im : images) { accum(im); } histogram.normalise(); }
static DoubleFV extractFeature(MBFImage image) { final HistogramModel model = new HistogramModel(4, 4, 4); model.estimateModel(image); return model.histogram.normaliseFV(); } }
double max = 0.0; int max_i = 0; double[] vec = model.getFeatureVector().asDoubleVector(); for( int i = 0; i < vec.length; i++ ) { if( vec[i] > max ) {
@Override public float classifyPatch(MBFImage patch) { HistogramModel h = new HistogramModel(model.histogram.nbins); h.estimateModel(patch); return (float) model.histogram.compare(h.histogram, compare); }
@Override public HistogramModel clone() { final HistogramModel model = new HistogramModel(); model.histogram = histogram.clone(); model.ndims = ndims; return model; }
final double thresh = gamma * fv.max(); int count = 0; for (final double f : fv.values) {
/** * Construct with the given number of bins per dimension * * @param nbins * the number of bins in each dimension for the histograms */ public HistogramModel(int... nbins) { super(nbins.length); assert (nbins.length > 0); histogram = new MultidimensionalHistogram(nbins); }