Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / RasterFilter.java @ 11076

History | View | Annotate | Download (6.99 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.awt.Image;
22
import java.util.Hashtable;
23

    
24
import org.cresques.geo.ViewPortData;
25
import org.cresques.px.Extent;
26
import org.gvsig.raster.dataset.IBuffer;
27

    
28
/**
29
 * Filtro para raster. Ancestro de todos los filtros.
30
 * 
31
 * @author Nacho Brodin (nachobrodin@gmail.com)
32
 * @author Luis W. Sevilla (sevilla_lui@gva.es)
33
 */
34
public abstract class RasterFilter implements IRasterFilter {
35
        /**
36
         * Nombre del filtro. Este nombre debe asignarlo cada clase de filtro especifico y es necesario
37
         * para leer el nombre en el listado de fitros de la pila.
38
         */
39
        protected String                fName = "";
40
        /**
41
         * Prioridad para la ejecuci?n del filtro en la pila. A mayor valor mayor prioridad en la
42
         * ejecuci?n. Los filtros de una misma prioridad ser?n ejecutados en orden aleatorio.
43
         * La prioridad asignada en la clase a un filtro han de ser valores mayores que 20 ya
44
         * que de 0-20 son utilizados para el orden de usuario. 
45
         */
46
        protected int                        fPriority = 0;
47
    protected IBuffer                 raster = null;
48
    protected int                         height = 0;
49
    protected int                         width = 0;
50
    protected Hashtable         params = new Hashtable();
51
    protected Extent                extent = null;
52
    /**
53
     * Variable que control la aplicaci?n o no del filtro. Si est? a false aunque est? en 
54
     * la pila el filtro no se ejecutar?.
55
     */
56
    protected boolean                 exec = true; 
57

    
58
    /**
59
     * @author Nacho Brodin (nachobrodin@gmail.com)
60
     */
61
    public static class Kernel{
62
            public double[][] kernel = null;
63
            protected double divisor = 0;
64
            
65
            public Kernel(double[][] k){
66
                    this.kernel = k;
67
                    
68
                    for (int i=0;i< kernel.length;i++)
69
                            for (int j=0;j<kernel[0].length;j++)
70
                                    divisor = divisor + kernel[i][j];
71
            }
72
            
73
            public Kernel(double[][] k,double divisor){
74
                    this.kernel = k;
75
                    this.divisor = divisor;
76
            }
77
            
78
            public double kernelOperation(Kernel k){
79
                    double res = 0;
80
                    for (int i=0;i< kernel.length;i++)
81
                            for (int j=0;j<kernel[0].length;j++)
82
                                    res += kernel[i][j] *  k.kernel[i][j];
83
                    return res;
84
            }
85
            
86
            public double convolution (Kernel k){
87
                    double res =0;
88
                    res = this.kernelOperation(k);
89
                    if (this.divisor !=0)
90
                            res = res/divisor;
91
                    return Math.abs(res);
92
            }
93

    
94
                public double getDivisor() {
95
                        return divisor;
96
                }
97

    
98
                public void setDivisor(double divisor) {
99
                        this.divisor = divisor;
100
                }
101
                
102
                public int getLado(){
103
                        return kernel.length;
104
                }
105
    }
106

    
107
    /**
108
     * Constructor
109
     */
110
    public RasterFilter() {
111
    }
112

    
113
    /**
114
     * Aplica el filtro sobre el raster pasado pixel a pixel
115
     */
116
    public void execute() {
117
        pre();
118
        if (exec) {
119
                for (int col = 0; col < width; col += 1)
120
                        for (int line = 0; line < height; line += 1) 
121
                                process(col, line);
122
        }
123
        post();
124
    }
125

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

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

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

    
167
        /**
168
         * Asigna el valor a la variable exec. Esta estar? a true si el filtro se ejecutar? la pr?xima
169
         * vez que se repinte o false si no se ejecuta.
170
         * @param exec
171
         */
172
        public void setExec(boolean exec) {
173
                this.exec = exec;
174
        }
175
        
176
        /**
177
         * Obtiene el nombre del filtro. Este nombre debe asignarlo cada clase 
178
         * de filtro especifico y es necesario para leer el nombre en el listado de fitros de la pila.
179
         * @return Cadena que representa el nombre del filtro. 
180
         */
181
        public String getName() {
182
                return fName;
183
        }
184
        
185
        /**
186
         * Asigna el nombre del filtro. 
187
         * @param fName Cadena que representa el identificador del filtro 
188
         */
189
        public void setName(String fName) {
190
                this.fName = fName;
191
        }
192
        
193
        /**
194
         * Obtiene la prioridad del filtro. Esta prioridad debe asignarla cada clase 
195
         * de filtro especifico y es necesaria para el orden de ejecuci?n.
196
         * A mayor valor mayor prioridad en la ejecuci?n. Los filtros de una misma 
197
         * prioridad ser?n ejecutados en orden aleatorio. La prioridad asignada en la 
198
         * clase a un filtro han de ser valores mayores que 20 ya que de 0-20 son utilizados 
199
         * para el orden de usuario. 
200
         *
201
         * @return Entero que representa la prioridad del filtro. 
202
         */
203
        public int getPriority() {
204
                return fPriority;
205
        }
206
        
207
        /**
208
         * Asigna la prioridad del filtro. 
209
         * A mayor valor mayor prioridad en la ejecuci?n. Los filtros de una misma 
210
         * prioridad ser?n ejecutados en orden aleatorio. La prioridad asignada en la 
211
         * clase a un filtro han de ser valores mayores que 20 ya que de 0-20 son utilizados 
212
         * para el orden de usuario. 
213
         * @param fName Cadena que representa el identificador del filtro 
214
         */
215
        public void setPriority(int fPriority) {
216
                this.fPriority = fPriority;
217
        }
218
    
219
    /**
220
     * Funci?n que contiene el c?digo a ejecutar antes de aplicar el filtro
221
     */
222
    abstract public void pre();
223

    
224
    /**
225
     * Funci?n que contiene el c?digo a ejecutar despues de aplicar el filtro
226
     */
227
    abstract public void post();
228

    
229
    /**
230
     * Ejecuci?n del filtro para un pixel de la imagen
231
     */
232
    abstract public void process(int x, int y);
233
    
234
    /**
235
     * Obtiene el tipo de datos del raster de entrada
236
     */
237
    abstract public int getInRasterDataType();
238

    
239
    /**
240
     * Obtiene el tipo de datos del raster de salida
241
     */
242
    abstract public int getOutRasterDataType();
243

    
244
    /**
245
     * Obtiene el resultado del filtro despues de su ejecuci?n a trav?s de una clave
246
     * @param name        clave para obtener un objeto resultado del filtro.
247
     */
248
    abstract public Object getResult(String name);
249

    
250
}