Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / grid / filter / enhancement / LinearStretchEnhancementFilter.java @ 27361

History | View | Annotate | Download (9.55 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.enhancement;
20

    
21
import org.gvsig.raster.buffer.RasterBuffer;
22
import org.gvsig.raster.buffer.cache.RasterReadOnlyBuffer;
23
import org.gvsig.raster.dataset.FileNotOpenException;
24
import org.gvsig.raster.dataset.IBuffer;
25
import org.gvsig.raster.dataset.Params;
26
import org.gvsig.raster.dataset.io.RasterDriverException;
27
import org.gvsig.raster.dataset.properties.DatasetListStatistics;
28
import org.gvsig.raster.grid.filter.RasterFilter;
29
import org.gvsig.raster.grid.filter.enhancement.LinearStretchParams.Stretch;
30
/**
31
 * Clase base para los filtros de realzado lineal. Lee el m?nimo y m?xmo de la
32
 * clase Statistic que ser?n calculados por PercentTailTrimFilter o
33
 * ComputeMinMaxFilter dependiendo de si est? activado el recorte de colas o no.
34
 * En Statistic tambi?n est?n los segundos valores despu?s del m?nimo y m?ximo
35
 * que son los que se utilizan con la opci?n eliminar extremos activada. Estos
36
 * se usaran en vez del m?nimo y m?ximo cuando la variable removeExtrema est? a
37
 * true.
38
 *
39
 * @version 31/05/2007
40
 * @author Nacho Brodin (nachobrodin@gmail.com)
41
 */
42
public class LinearStretchEnhancementFilter extends RasterFilter {
43
        protected double[][]               scale             = null;
44
        protected double[][]               offset            = null;
45
        protected DatasetListStatistics           stats             = null;
46
        protected double[]                 minBandValue             = null;
47
        protected double[]                 maxBandValue             = null;
48
        protected int[]                    renderBands       = null;
49
        public static String[]             names             = new String[] {"enhanced_stretch"};
50
        private boolean                    removeEnds        = false;
51
        
52
        protected LinearStretchParams      stretchs          = null;
53
        protected Stretch[]                scaleOffsetList   = null;
54

    
55
        /**
56
         * Construye un LinearEnhancementFilter
57
         */
58
        public LinearStretchEnhancementFilter() {
59
                setName(names[0]);
60
        }
61

    
62
        /*
63
         * (non-Javadoc)
64
         * @see org.gvsig.raster.grid.filter.RasterFilter#pre()
65
         */
66
        public void pre() {
67
                raster = (IBuffer) params.get("raster");
68
                stats = (DatasetListStatistics) params.get("stats");
69
                stretchs = (LinearStretchParams) params.get("stretchs");
70
                if (params.get("remove") != null)
71
                        removeEnds = ((Boolean) params.get("remove")).booleanValue();
72

    
73
                if (stretchs == null)
74
                        return;
75

    
76
                renderBands = (int[]) params.get("renderBands");
77
                if (renderBands == null)
78
                        renderBands = new int[0];
79
                if (renderBands != null && renderBands.length < raster.getBandCount()) {
80
                        int[] newRenderBands = new int[raster.getBandCount()];
81
                        for (int i = 0; i < renderBands.length; i++)
82
                                newRenderBands[i] = renderBands[i];
83
                        for (int i = renderBands.length; i < newRenderBands.length; i++)
84
                                newRenderBands[i] = i;
85
                        renderBands = newRenderBands;
86
                }
87

    
88
                height = raster.getHeight();
89
                width = raster.getWidth();
90

    
91
                try {
92
                        stats.calcFullStatistics();
93
                } catch (FileNotOpenException e) {
94
                        exec = false;
95
                } catch (RasterDriverException e) {
96
                        exec = false;
97
                } catch (InterruptedException e) {
98
                        exec = false;
99
                }
100

    
101
                if (raster.getDataType() != IBuffer.TYPE_BYTE)
102
                        stretchs.rgb = false;
103

    
104
                stretchs.setMaxMin(stats, renderBands);
105

    
106
                if (removeEnds)
107
                        stretchs.applyRemoveEndsToStretchs(stats, renderBands);
108

    
109
                stretchs.loadTailTrimValues(stats);
110

    
111
                if (stretchs.hasTailTrim())
112
                        stretchs.applyTrimToStretchs();
113

    
114
                stretchs.calcLinearScaleAndOffset();
115

    
116
                loadStretchList();
117

    
118
                if(raster instanceof RasterReadOnlyBuffer) 
119
                        ((RasterReadOnlyBuffer) raster).addDrawableBands(renderBands);
120

    
121
                rasterResult = RasterBuffer.getBuffer(IBuffer.TYPE_BYTE, raster.getWidth(), raster.getHeight(), raster.getBandCount(), true);
122
        }
123

    
124
        /**
125
         * La lista de escalas y desplazamientos es un array de 3 elementos en el que 
126
         * cada posici?n es un objeto Stretch con la escala y desplazamiento de la 
127
         * banda que se dibuja en esa posici?n. El objetivo es aplicar a cada banda
128
         * el m?ximo y m?nimo que le corresponde. Por ejemplo, cuando tenemos una imagen de
129
         * 3 bandas de tipo short y queremos visualizar en RGB solo la primera banda entonces
130
         * escaleOffsetList tendr? stretchs.red en las 3 posiciones.
131
         */
132
        private void loadStretchList() {
133
                scaleOffsetList = new Stretch[3];
134
                scaleOffsetList[0] = stretchs.red;
135
                scaleOffsetList[1] = stretchs.green;
136
                scaleOffsetList[2] = stretchs.blue;
137
        }
138

    
139
        /**
140
         * Obtiene el porcentaje de recorte de colas aplicado o 0 si no tiene.
141
         * @return
142
         */
143
        public Double getTailTrim(){
144
                double[] tailTrimList;
145
                if (stretchs != null)
146
                        tailTrimList = stretchs.getTailTrimList();
147
                else
148
                        tailTrimList = new double[0];
149
                double median = 0;
150
                double nValues = 0;
151
                for (int i = 0; i < tailTrimList.length; i++) {
152
                        median += tailTrimList[i];
153
                        if(nValues != 0)
154
                                nValues ++;
155
                }
156
                return new Double(nValues > 0 ? median / nValues : median);
157
        }
158

    
159
        /*
160
         * (non-Javadoc)
161
         * @see org.gvsig.raster.grid.filter.RasterFilter#getOutRasterDataType()
162
         */
163
        public int getOutRasterDataType() {
164
                return IBuffer.TYPE_BYTE;
165
        }
166

    
167
        /**
168
         * Obtiene true si est? activado el flag de eliminar extremos y false si no lo
169
         * est?
170
         */
171
        public Boolean getRemoveEnds() {
172
                return new Boolean(removeEnds);
173
        }
174
        
175
        /*
176
         * (non-Javadoc)
177
         * @see org.gvsig.raster.grid.filter.RasterFilter#getResult(java.lang.String)
178
         */
179
        public Object getResult(String name) {
180
                if (name.equals("raster")) {
181
                        if (!exec)
182
                                return this.raster;
183
                        return this.rasterResult;
184
                }
185
                return null;
186
        }
187

    
188
        /*
189
         * (non-Javadoc)
190
         * @see org.gvsig.raster.grid.filter.RasterFilter#getGroup()
191
         */
192
        public String getGroup() {
193
                return "radiometricos";
194
        }
195

    
196
        /*
197
         * (non-Javadoc)
198
         * @see org.gvsig.raster.grid.filter.RasterFilter#getUIParams()
199
         */
200
        public Params getUIParams(String nameFilter) {
201
                if(stretchs == null)
202
                        stretchs = (LinearStretchParams) this.params.get("stretchs");
203
                Params params = new Params();
204
                params.setParam("TailTrim",
205
                                new Double(Math.round(getTailTrim().doubleValue() * 100.0)),
206
                                Params.SLIDER,
207
                                new String[]{ "0", "100", "0", "1", "25" }); //min, max, valor defecto, intervalo peque?o, intervalo grande;
208
                params.setParam("StretchInRed",
209
                                stretchs.red.stretchIn,
210
                                Params.CHOICE,
211
                                null);
212
                params.setParam("StretchInGreen",
213
                                stretchs.green.stretchIn,
214
                                Params.CHOICE,
215
                                null);
216
                params.setParam("StretchInBlue",
217
                                stretchs.blue.stretchIn,
218
                                Params.CHOICE,
219
                                null);
220
                params.setParam("StretchOutRed",
221
                                stretchs.red.stretchOut,
222
                                Params.CHOICE,
223
                                null);
224
                params.setParam("StretchOutGreen",
225
                                stretchs.green.stretchOut,
226
                                Params.CHOICE,
227
                                null);
228
                params.setParam("StretchOutBlue",
229
                                stretchs.blue.stretchOut,
230
                                Params.CHOICE,
231
                                null);
232
                params.setParam("TailTrimRedMin",
233
                                new Double(stretchs.red.tailTrimMin),
234
                                Params.CHOICE,
235
                                null);
236
                params.setParam("TailTrimRedMax",
237
                                new Double(stretchs.red.tailTrimMax),
238
                                Params.CHOICE,
239
                                null);
240
                params.setParam("TailTrimGreenMin",
241
                                new Double(stretchs.green.tailTrimMin),
242
                                Params.CHOICE,
243
                                null);
244
                params.setParam("TailTrimGreenMax",
245
                                new Double(stretchs.green.tailTrimMax),
246
                                Params.CHOICE,
247
                                null);
248
                params.setParam("TailTrimBlueMin",
249
                                new Double(stretchs.blue.tailTrimMin),
250
                                Params.CHOICE,
251
                                null);
252
                params.setParam("TailTrimBlueMax",
253
                                new Double(stretchs.blue.tailTrimMax),
254
                                Params.CHOICE,
255
                                null);
256
                params.setParam("Remove",
257
                                new Boolean(removeEnds),
258
                                Params.CHOICE,
259
                                null);
260
                if(renderBands == null)
261
                        renderBands = (int[]) this.params.get("renderBands");
262
                params.setParam("RenderBands",
263
                                convertArrayToString(renderBands),
264
                                Params.NONE,
265
                                null);
266
                params.setParam("RGB",
267
                                new Boolean(stretchs.rgb),
268
                                Params.NONE,
269
                                null);
270
                return params;
271
        }
272

    
273
        /**
274
         * Convierte un array de dobles a una cadena
275
         * @param values
276
         * @return
277
         */
278
        private String convertArrayToString(int[] values) {
279
                StringBuffer buffer = new StringBuffer();
280
                for (int i = 0; i < values.length; i++) {
281
                        buffer.append(values[i]);
282
                        if (i < (values.length - 1))
283
                                buffer.append(" ");
284
                }
285
                return buffer.toString();
286
        }
287
        
288
        /*
289
         * (non-Javadoc)
290
         * @see org.gvsig.raster.grid.filter.RasterFilter#post()
291
         */
292
        public void post() {
293
                // En caso de que nadie apunte a raster, se liberar? su memoria.
294
                raster = null;
295
        }
296

    
297
        /*
298
         * (non-Javadoc)
299
         * @see org.gvsig.raster.grid.filter.RasterFilter#getInRasterDataType()
300
         */
301
        public int getInRasterDataType() {
302
                return 0;
303
        }
304

    
305
        /*
306
         * (non-Javadoc)
307
         * @see org.gvsig.raster.grid.filter.RasterFilter#process(int, int)
308
         */
309
        public void process(int x, int y) throws InterruptedException {
310
        }
311

    
312
        /*
313
         * (non-Javadoc)
314
         * @see org.gvsig.raster.grid.filter.RasterFilter#getNames()
315
         */
316
        public String[] getNames() {
317
                return names;
318
        }
319
        
320
        /*
321
         * (non-Javadoc)
322
         * @see org.gvsig.raster.grid.filter.RasterFilter#isVisible()
323
         */
324
        public boolean isVisible() {
325
                return false;
326
        }
327

    
328
        /**
329
         * @return the stretchs
330
         */
331
        public LinearStretchParams getStretchs() {
332
                return stretchs;
333
        }
334
}