private float[] normaliseSamples(float[] samples) { final float sum = FloatArrayStatsUtils.sum(samples); for (int i = 0; i < samples.length; i++) { samples[i] /= sum; } return samples; }
@Override public Float processGridElement(FImage patch) { return FloatArrayStatsUtils.var(patch.pixels); } }
public void printStructureTensorStats() { System.out.format("Structure tensor stats for sd/si = %4.2f/%4.2f\n", detectionScale, integrationScale); System.out.format( "\tlxmx mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lxmxblur.pixels), FloatArrayStatsUtils.std(lxmxblur.pixels), lxmx.max(), lxmx.min()); System.out.format( "\tlxmy mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lxmyblur.pixels), FloatArrayStatsUtils.std(lxmyblur.pixels), lxmy.max(), lxmy.min()); System.out.format( "\tlymy mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lymyblur.pixels), FloatArrayStatsUtils.std(lymyblur.pixels), lymy.max(), lymy.min()); }
private void medianFilter(FImage output, List<List<Pixel>> rays) { if (rays.size() == 0) return; Collections.sort(rays, new Comparator<List<Pixel>>() { @Override public int compare(List<Pixel> o1, List<Pixel> o2) { return o1.size() - o2.size(); } }); final float[] working = new float[rays.get(rays.size() - 1).size()]; for (final List<Pixel> ray : rays) { final int length = ray.size(); for (int i = 0; i < length; i++) { final Pixel pixel = ray.get(i); working[i] = output.pixels[pixel.y][pixel.x]; } final float median = FloatArrayStatsUtils.median(working, 0, length); for (int i = 0; i < length; i++) { final Pixel pixel = ray.get(i); if (output.pixels[pixel.y][pixel.x] > median) output.pixels[pixel.y][pixel.x] = median; } } }
/** * Create a kernel image with given kernel size and variance. * @param width image width. * @param height image height. * @param sigma variance. * @return new kernel image. */ public static FImage createKernelImage(int width, int height, float sigma) { FImage f = new FImage(width, height); int hw = (width-1)/2; int hh = (height-1)/2; float sigmasq = sigma * sigma; float sigma4 = sigmasq*sigmasq; for (int y=-hh, j=0; y<hh; y++, j++) { for (int x=-hw, i=0; x<hw; x++, i++) { int radsqrd = x*x + y*y; f.pixels[j][i] = (float) (-1 / (PI*sigma4)*(1-radsqrd/(2*sigmasq))*exp(-radsqrd/(2*sigmasq))); } } return f.subtractInplace(FloatArrayStatsUtils.mean(f.pixels)); } }
/** * Calculate the sum of the absolute values of a 2D array. * * @param arr * @return the sum absolute values */ public static float sumAbs(float[][] arr) { float sum = 0; for (int i = 0; i < arr.length; i++) sum += sumAbs(arr[i]); return sum; }
/** * Calculate the sum of the squared values of a 2D array. * * @param arr * @return sum of squares */ public static float sumSq(float[][] arr) { float sum = 0; for (int i = 0; i < arr.length; i++) sum += sumSq(arr[i]); return sum; }
public void printStructureTensorStats() { System.out.format("Structure tensor stats for sd/si = %4.2f/%4.2f\n", detectionScale, integrationScale); System.out.format( "\tlxmx mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lxmxblur.pixels), FloatArrayStatsUtils.std(lxmxblur.pixels), lxmx.max(), lxmx.min()); System.out.format( "\tlxmy mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lxmyblur.pixels), FloatArrayStatsUtils.std(lxmyblur.pixels), lxmy.max(), lxmy.min()); System.out.format( "\tlymy mean/std = %4.2e/%4.2e max/min = %4.2e/%4.2e\n", FloatArrayStatsUtils.mean(lymyblur.pixels), FloatArrayStatsUtils.std(lymyblur.pixels), lymy.max(), lymy.min()); }
private void medianFilter(FImage output, List<List<Pixel>> rays) { if (rays.size() == 0) return; Collections.sort(rays, new Comparator<List<Pixel>>() { @Override public int compare(List<Pixel> o1, List<Pixel> o2) { return o1.size() - o2.size(); } }); final float[] working = new float[rays.get(rays.size() - 1).size()]; for (final List<Pixel> ray : rays) { final int length = ray.size(); for (int i = 0; i < length; i++) { final Pixel pixel = ray.get(i); working[i] = output.pixels[pixel.y][pixel.x]; } final float median = FloatArrayStatsUtils.median(working, 0, length); for (int i = 0; i < length; i++) { final Pixel pixel = ray.get(i); if (output.pixels[pixel.y][pixel.x] > median) output.pixels[pixel.y][pixel.x] = median; } } }
/** * Create a kernel image with given kernel size and variance. * @param width image width. * @param height image height. * @param sigma variance. * @return new kernel image. */ public static FImage createKernelImage(int width, int height, float sigma) { FImage f = new FImage(width, height); int hw = (width-1)/2; int hh = (height-1)/2; float sigmasq = sigma * sigma; float sigma4 = sigmasq*sigmasq; for (int y=-hh, j=0; y<hh; y++, j++) { for (int x=-hw, i=0; x<hw; x++, i++) { int radsqrd = x*x + y*y; f.pixels[j][i] = (float) (-1 / (PI*sigma4)*(1-radsqrd/(2*sigmasq))*exp(-radsqrd/(2*sigmasq))); } } return f.subtractInplace(FloatArrayStatsUtils.mean(f.pixels)); } }
private float[] normaliseSamples(float[] samples) { final float sum = FloatArrayStatsUtils.sum(samples); for (int i = 0; i < samples.length; i++) { samples[i] /= sum; } return samples; }
@Override public void processImage(FImage image) { final float[] tmp = new float[support.size()]; final FImage tmpImage = new FImage(image.width, image.height); for (int y = 0; y < image.height; y++) { for (int x = 0; x < image.width; x++) { int count = 0; for (final Pixel sp : support) { final int xx = x + sp.x; final int yy = y + sp.y; if (xx >= 0 && xx < image.width - 1 && yy >= 0 && yy < image.height - 1) { tmp[count++] = image.pixels[yy][xx]; } } tmpImage.pixels[y][x] = FloatArrayStatsUtils.median(tmp, 0, count); } } image.internalAssign(tmpImage); } }
@Override public Float processGridElement(FImage patch) { return FloatArrayStatsUtils.var(patch.pixels); } }
@Override public void processCorrelationMap(FImage img, FImage template, FImage corr) { SummedAreaTable sum = new SummedAreaTable(); img.analyseWith(sum); final float templateMean = FloatArrayStatsUtils.mean(template.pixels); //TODO: cache this final float[][] pix = corr.pixels; for( int y = 0; y < corr.height; y++ ) { for( int x = 0; x < corr.width; x++ ) { double num = pix[y][x]; double t = sum.calculateArea(x, y, x+template.width, y+template.height); num -= t * templateMean; pix[y][x] = (float)num; } } } },
private float[] normaliseSamples(float[] samples) { final float sum = FloatArrayStatsUtils.sum(samples); for (int i = 0; i < samples.length; i++) { samples[i] /= sum; } return samples; }
@Override public void processImage(FImage image) { final float[] tmp = new float[support.size()]; final FImage tmpImage = new FImage(image.width, image.height); for (int y = 0; y < image.height; y++) { for (int x = 0; x < image.width; x++) { int count = 0; for (final Pixel sp : support) { final int xx = x + sp.x; final int yy = y + sp.y; if (xx >= 0 && xx < image.width - 1 && yy >= 0 && yy < image.height - 1) { tmp[count++] = image.pixels[yy][xx]; } } tmpImage.pixels[y][x] = FloatArrayStatsUtils.median(tmp, 0, count); } } image.internalAssign(tmpImage); } }