1 /** 2 * Copyright (c) 2011, The University of Southampton and the individual contributors. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * * Redistributions of source code must retain the above copyright notice, 9 * this list of conditions and the following disclaimer. 10 * 11 * * Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * * Neither the name of the University of Southampton nor the names of its 16 * contributors may be used to endorse or promote products derived from this 17 * software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 23 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 package org.openimaj.image.processing.convolution; 31 32 import static java.lang.Math.PI; 33 import static java.lang.Math.exp; 34 35 import org.openimaj.image.FImage; 36 import org.openimaj.math.util.FloatArrayStatsUtils; 37 38 /** 39 * 2D Laplacian of Gaussian filter 40 * 41 * @author Jonathon Hare (jsh2@ecs.soton.ac.uk) 42 */ 43 public class LaplacianOfGaussian2D extends FConvolution { 44 /** 45 * Construct with given kernel size and variance. 46 * @param width kernel width 47 * @param height kernel height 48 * @param sigma variance 49 */ 50 public LaplacianOfGaussian2D(int width, int height, float sigma) { 51 super(createKernelImage(width, height, sigma)); 52 } 53 54 /** 55 * Construct with given kernel size and variance. 56 * @param size kernel width/height 57 * @param sigma variance 58 */ 59 public LaplacianOfGaussian2D(int size, float sigma) { 60 super(createKernelImage(size, size, sigma)); 61 } 62 63 /** 64 * Create a kernel image with given kernel size and variance. 65 * @param size image height/width. 66 * @param sigma variance. 67 * @return new kernel image. 68 */ 69 public static FImage createKernelImage(int size, float sigma) { 70 return createKernelImage(size, size, sigma); 71 } 72 73 /** 74 * Create a kernel image with given kernel size and variance. 75 * @param width image width. 76 * @param height image height. 77 * @param sigma variance. 78 * @return new kernel image. 79 */ 80 public static FImage createKernelImage(int width, int height, float sigma) { 81 FImage f = new FImage(width, height); 82 int hw = (width-1)/2; 83 int hh = (height-1)/2; 84 float sigmasq = sigma * sigma; 85 float sigma4 = sigmasq*sigmasq; 86 87 for (int y=-hh, j=0; y<hh; y++, j++) { 88 for (int x=-hw, i=0; x<hw; x++, i++) { 89 int radsqrd = x*x + y*y; 90 f.pixels[j][i] = (float) (-1 / (PI*sigma4)*(1-radsqrd/(2*sigmasq))*exp(-radsqrd/(2*sigmasq))); 91 } 92 } 93 return f.subtractInplace(FloatArrayStatsUtils.mean(f.pixels)); 94 } 95 }