ingo@1115: /* ingo@1115: * Copyright (c) 2010 by Intevation GmbH ingo@1115: * ingo@1115: * This program is free software under the LGPL (>=v2.1) ingo@1115: * Read the file LGPL.txt coming with the software for details ingo@1115: * or visit http://www.gnu.org/licenses/ if it does not exist. ingo@1115: */ ingo@1115: sascha@441: package de.intevation.gnv.raster; sascha@441: sascha@779: import org.apache.log4j.Logger; sascha@779: sascha@441: import org.w3c.dom.Element; sascha@441: sascha@441: /** sascha@801: * An implemenation of raster filters based on given kernels. sascha@780: * @author Sascha L. Teichmann sascha@441: */ sascha@441: public class KernelFilter sascha@441: implements Filter sascha@441: { sascha@441: private static Logger log = Logger.getLogger(KernelFilter.class); sascha@441: sascha@801: /** sascha@801: * Implemens a factory which produces KernelFilters with Gauss kernels. sascha@801: */ sascha@441: public static class GaussFactory sascha@441: implements Filter.Factory sascha@441: { sascha@801: /** sascha@801: * Default sigma of Gauss kernel: {@value} sascha@801: */ sascha@441: public static final double DEFAULT_SIGMA = 1.0d; sascha@801: /** sascha@801: * Default radius of Gauss kernel: {@value} sascha@801: */ sascha@441: public static final int DEFAULT_RADIUS = 5; sascha@441: sascha@801: /** sascha@801: * Configured sigma. sascha@801: */ sascha@441: protected double sigma; sascha@801: /** sascha@801: * Configured radius. sascha@801: */ sascha@441: protected int radius; sascha@441: sascha@801: /** sascha@801: * Default constructor. sascha@801: */ sascha@441: public GaussFactory() { sascha@441: sigma = DEFAULT_SIGMA; sascha@441: radius = DEFAULT_RADIUS; sascha@441: } sascha@441: sascha@441: public void init(Element element) { sascha@441: String s = element.getAttribute("sigma"); sascha@441: String r = element.getAttribute("radius"); sascha@441: sascha@441: if ((s = s.trim()).length() > 0) { sascha@441: try { sascha@441: sigma = Math.abs(Double.parseDouble(s)); sascha@441: } sascha@441: catch (NumberFormatException nfe) { sascha@441: log.warn("gauss sigma '" + s + "' not a valid float value."); sascha@441: } sascha@441: } sascha@441: sascha@441: if ((r = r.trim()).length() > 0) { sascha@441: try { sascha@441: radius = Math.min(3, Math.abs(Integer.parseInt(r))); sascha@441: } sascha@441: catch (NumberFormatException nfe) { sascha@441: log.warn("gauss radius '" + r + "' not a valid integer value."); sascha@441: } sascha@441: } sascha@441: } sascha@441: sascha@441: public Filter create() { sascha@441: return new KernelFilter(Raster.Kernel.createGauss(sigma, radius)); sascha@441: } sascha@441: } // class GaussFactory sascha@441: sascha@801: /** sascha@801: * The kernel used by this filter. sascha@801: */ sascha@441: protected Raster.Kernel kernel; sascha@441: sascha@801: /** sascha@801: * Default constructor. sascha@801: */ sascha@441: public KernelFilter() { sascha@441: } sascha@441: sascha@801: /** sascha@801: * Constructor to create a filter with a given kernel. sascha@801: * @param kernel The kernel to be used. sascha@801: */ sascha@441: public KernelFilter(Raster.Kernel kernel) { sascha@441: this.kernel = kernel; sascha@441: } sascha@441: sascha@441: public Raster filter(Raster raster) { sascha@441: return raster.create(kernel); sascha@441: } sascha@441: } sascha@798: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :