Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / RasterFilter.java @ 11930

History | View | Annotate | Download (6.48 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 */
19
package org.gvsig.raster.grid.filter;
20

    
21
import java.util.Hashtable;
22

    
23
import org.gvsig.raster.dataset.IBuffer;
24
import org.gvsig.raster.dataset.Params;
25
import org.gvsig.raster.shared.Extent;
26

    
27
/**
28
 * Filtro para raster. Ancestro de todos los filtros.
29
 * 
30
 * @author Nacho Brodin (nachobrodin@gmail.com)
31
 * @author Luis W. Sevilla (sevilla_lui@gva.es)
32
 */
33
public abstract class RasterFilter implements IRasterFilter, Cloneable {
34
        /**
35
         * Nombre del filtro. Este nombre debe asignarlo cada clase de filtro especifico y es necesario
36
         * para leer el nombre en el listado de fitros de la pila.
37
         */
38
        protected String                        fName = "";
39

    
40
  protected IBuffer                 raster = null;
41
  protected int                         height = 0;
42
  protected int                         width = 0;
43
  protected Hashtable        params = new Hashtable();
44
  protected Extent                extent = null;
45
        private int                                 percent = 0;
46
        private boolean                        canceled = false;
47
  /**
48
   * Variable que control la aplicaci?n o no del filtro. Si est? a false aunque est? en 
49
   * la pila el filtro no se ejecutar?.
50
   */
51
  protected boolean                 exec = true; 
52

    
53
  /**
54
   * @author Nacho Brodin (nachobrodin@gmail.com)
55
   */
56
  public static class Kernel {
57
                public double[][]        kernel        = null;
58
                protected double        divisor = 0;
59
                
60
                public Kernel(double[][] k) {
61
                        this.kernel = k;
62

    
63
                        for (int i = 0; i < kernel.length; i++)
64
                                for (int j = 0; j < kernel[0].length; j++)
65
                                        divisor = divisor + kernel[i][j];
66
                }
67
                
68
                public Kernel(double[][] k,double divisor){
69
                        this.kernel = k;
70
                        this.divisor = divisor;
71
                }
72
                
73
                public double kernelOperation(Kernel k) {
74
                        double res = 0;
75
                        for (int i = 0; i < kernel.length; i++)
76
                                for (int j = 0; j < kernel[0].length; j++)
77
                                        res += kernel[i][j] * k.kernel[i][j];
78
                        return res;
79
                }
80
                
81
                public double convolution(Kernel k) {
82
                        double res = 0;
83
                        res = this.kernelOperation(k);
84
                        if (this.divisor != 0)
85
                                res = res / divisor;
86
                        return Math.abs(res);
87
                }
88
        
89
                public double getDivisor() {
90
                        return divisor;
91
                }
92
        
93
                public void setDivisor(double divisor) {
94
                        this.divisor = divisor;
95
                }
96
                
97
                public int getLado(){
98
                        return kernel.length;
99
                }
100
  }
101

    
102
  /**
103
   * Constructor
104
   */
105
  public RasterFilter() {
106
  }
107

    
108
  /**
109
   * Aplica el filtro sobre el raster pasado pixel a pixel
110
   */
111
  public void execute() {
112
                pre();
113
                
114
                percent = 0;
115
                if (exec) {
116
                        for (int row = 0; row < height; row ++) {
117
                                for (int col = 0; col < width; col ++) 
118
                                        process(col, row);
119
                                percent = (row * 100) / height;
120
                        }
121
                }
122
                if (isCanceled())
123
                        return;
124
                percent = 100;
125
                post();
126
        }
127

    
128
  /**
129
         * A?ade un par?metro al filtro
130
         * 
131
         * @param name Clave del par?metro
132
         * @param param Objeto pasado como par?metro
133
         */
134
  public void addParam(String name, Object param) {
135
      params.put(name, param);
136
  }
137

    
138
  /**
139
   * Elimina un par?metro del filtro
140
   * @param name Clave del par?metro a eliminar
141
   */
142
  public void removeParam(String name){
143
          params.remove(name);
144
  }
145
  
146
  /**
147
   * Obtiene un par?metro a partir de la clave
148
   * @param name Par?metro
149
   * @return Par?metro
150
   */
151
  public Object getParam(String name){
152
          return params.get(name);
153
  }
154
  
155
    /**
156
         * @param extent The extent to set.
157
         */
158
        public void setExtent(Extent extent) {
159
                this.extent = extent;
160
        }
161

    
162
        /**
163
         * Obtiene true si el filtro va a ser ejecutado o false si no va a serlo
164
         * @return
165
         */
166
        public boolean isExec() {
167
                return exec;
168
        }
169

    
170
        /**
171
         * Asigna el valor a la variable exec. Esta estar? a true si el filtro se ejecutar? la pr?xima
172
         * vez que se repinte o false si no se ejecuta.
173
         * @param exec
174
         */
175
        public void setExec(boolean exec) {
176
                this.exec = exec;
177
        }
178
        
179
        /**
180
         * Obtiene el nombre del filtro. Este nombre debe asignarlo cada clase 
181
         * de filtro especifico y es necesario para leer el nombre en el listado de fitros de la pila.
182
         * @return Cadena que representa el nombre del filtro. 
183
         */
184
        public String getName() {
185
                return fName;
186
        }
187
        
188
        /**
189
         * Asigna el nombre del filtro. 
190
         * @param fName Cadena que representa el identificador del filtro 
191
         */
192
        public void setName(String fName) {
193
                this.fName = fName;
194
        }
195

    
196
        /**
197
         * Establece si se ha de cancelar un proceso de filtrado o no.
198
         * @param value
199
         */
200
        public void setCanceled(boolean value) {
201
                canceled = value;
202
        }
203

    
204
        /**
205
         * Devuelve si se ha cancelado el proceso de filtrar.
206
         * @return
207
         */
208
        public boolean isCanceled() {
209
                return canceled;
210
        }
211
        
212
        /**
213
         * Pone a cero el contador del porcentaje del proceso de filtrado
214
         * @return
215
         */
216
        public void resetPercent() {
217
                percent = 0;
218
        }
219

    
220
        /**
221
         * Obtiene el porcentaje recorrido del proceso de filtrado
222
         * @return
223
         */
224
        public int getPercent() {
225
                return percent;
226
        }        
227

    
228
  /**
229
   * Funci?n que contiene el c?digo a ejecutar antes de aplicar el filtro
230
   */
231
  abstract public void pre();
232

    
233
  /**
234
   * Funci?n que contiene el c?digo a ejecutar despues de aplicar el filtro
235
   */
236
  abstract public void post();
237

    
238
  /**
239
   * Ejecuci?n del filtro para un pixel de la imagen
240
   */
241
  abstract public void process(int x, int y);
242
  
243
  /**
244
   * Obtiene el tipo de datos del raster de entrada
245
   */
246
  abstract public int getInRasterDataType();
247

    
248
  /**
249
   * Obtiene el tipo de datos del raster de salida
250
   */
251
  abstract public int getOutRasterDataType();
252

    
253
  /**
254
   * Obtiene el resultado del filtro despues de su ejecuci?n a trav?s de una clave
255
   * @param name        clave para obtener un objeto resultado del filtro.
256
   */
257
  abstract public Object getResult(String name);
258

    
259
        /*
260
         * (non-Javadoc)
261
         * @see org.gvsig.raster.grid.filter.IRasterFilter#getGroup()
262
         */
263
        abstract public String getGroup();
264
        
265
        /**
266
         * Obtener que datos puede tratar una interfaz con sus valores
267
         * @return
268
         */
269
        abstract public Params getUIParams();
270

    
271
        /* (non-Javadoc)
272
         * @see java.lang.Object#clone()
273
         */
274
        public Object clone() throws CloneNotSupportedException {
275
                return super.clone();
276
        }
277
}