root / trunk / libraries / libCq_CMS_praster / src / org / cresques / filter / correction / MedianFloatFilter.java @ 8026
History | View | Annotate | Download (4.86 KB)
1 |
package org.cresques.filter.correction; |
---|---|
2 |
|
3 |
import java.util.Arrays; |
4 |
|
5 |
import org.cresques.io.data.RasterBuf; |
6 |
|
7 |
public class MedianFloatFilter extends MedianFilter { |
8 |
|
9 |
public void process(int col, int line) { |
10 |
float[] pxOut = new float[4]; |
11 |
float[] px = new float[4]; |
12 |
|
13 |
ladoVentana = Math.abs(ladoVentana); // El lado de la ventana debe |
14 |
if(ladoVentana % 2 == 0) ladoVentana++; // ser positivo e impar. |
15 |
int tamVentana = ladoVentana*ladoVentana;
|
16 |
int mitadLado = (ladoVentana-1)>>1; |
17 |
float [] ventanaR = new float[tamVentana]; |
18 |
float [] ventanaG = new float[tamVentana]; |
19 |
float [] ventanaB = new float[tamVentana]; |
20 |
int k;
|
21 |
|
22 |
raster.getElemFloat(line,col,px); |
23 |
|
24 |
if((col-mitadLado >= 0) && (line-mitadLado >= 0) &&(col+mitadLado < width)&&(line+mitadLado < height)) |
25 |
{ |
26 |
// Obtener el vector con la ventanas de muestras (una por componente banda)
|
27 |
k=0;
|
28 |
for (int i=-mitadLado;i<=mitadLado;i++) |
29 |
for(int j=-mitadLado;j<=mitadLado;j++) |
30 |
{ |
31 |
raster.getElemFloat(line+j,col+i,px); |
32 |
ventanaR[k] =px[0];
|
33 |
ventanaG[k] =px[1];
|
34 |
ventanaB[k] =px[2];
|
35 |
k++; |
36 |
} |
37 |
|
38 |
// Ordenar los valores de las ventanas
|
39 |
// se supone que usa quickSort.
|
40 |
Arrays.sort(ventanaR);
|
41 |
Arrays.sort(ventanaG);
|
42 |
Arrays.sort(ventanaB);
|
43 |
|
44 |
pxOut[0]=ventanaR[(tamVentana-1)/2]; |
45 |
pxOut[1]=ventanaG[(tamVentana-1)/2]; |
46 |
pxOut[2]=ventanaB[(tamVentana-1)/2]; |
47 |
|
48 |
//Extraer los elementos centrales y asignarselos al pixel (x,y)
|
49 |
|
50 |
rasterResult.setElemFloat(line, col, pxOut); |
51 |
} |
52 |
else rasterResult.setElemFloat(line, col, px);
|
53 |
|
54 |
} |
55 |
|
56 |
public void processSuperSampling(int col, int line) { |
57 |
float[] px = new float[4]; |
58 |
float[] pxOut = new float[4]; |
59 |
ladoVentana = Math.abs(ladoVentana); // El lado de la ventana debe |
60 |
if(ladoVentana % 2 == 0) ladoVentana++; // ser positivo e impar. |
61 |
int tamVentana = ladoVentana*ladoVentana;
|
62 |
int mitadLado = (ladoVentana-1)>>1; |
63 |
int indiceX,indiceY,origenX,origenY;
|
64 |
|
65 |
float [] ventanaR = new float[tamVentana]; |
66 |
float [] ventanaG = new float[tamVentana]; |
67 |
float [] ventanaB = new float[tamVentana]; |
68 |
|
69 |
raster.getElemFloat(line,col,px); |
70 |
|
71 |
if ((contX+1-mitadLado>=0) && (contY+1-mitadLado>=0)&& (contX+1+mitadLado<stepX.length) && (contY+1+mitadLado<stepY.length)){ |
72 |
|
73 |
// Calcular el alcance del kernel cuyo centro es (x,y)
|
74 |
int offsetX=0; |
75 |
int offsetY=0; |
76 |
for (int i=0;i<mitadLado;i++){ |
77 |
offsetX=offsetX+stepX[contX+i+1];
|
78 |
offsetY=offsetY+stepY[contY+i+1];
|
79 |
} |
80 |
if((col+offsetX<width)&&(line+offsetY<height)){
|
81 |
// Obtener el vector con las ventanas de muestras (una por banda) **************************
|
82 |
// Me situo en la esquina superior izquierda del "kernel"
|
83 |
origenX=col; |
84 |
origenY=line; |
85 |
for (int i=0;i<mitadLado;i++){ |
86 |
origenX=origenX-stepX[contX-i]; |
87 |
origenY=origenY-stepY[contY-i]; |
88 |
} |
89 |
//Recorro el kernel seg�n los step
|
90 |
int k=0; |
91 |
indiceX=origenX; |
92 |
for (int i=-mitadLado;i<=mitadLado;i++){ |
93 |
indiceY=origenY; |
94 |
for(int j=-mitadLado;j<=mitadLado;j++){ |
95 |
raster.getElemFloat(indiceY,indiceX,px); |
96 |
ventanaR[k] =px[0];
|
97 |
ventanaG[k] =px [1];
|
98 |
ventanaB[k] =px[2];
|
99 |
indiceY=indiceY+stepY[contY+j+1];
|
100 |
k++; |
101 |
} |
102 |
indiceX=indiceX+stepX[contX+i+1];
|
103 |
} |
104 |
//**************************************************************************************************
|
105 |
|
106 |
// Ordenar los valores de las ventanas
|
107 |
// se supone que usa quickSort.
|
108 |
Arrays.sort(ventanaR);
|
109 |
Arrays.sort(ventanaG);
|
110 |
Arrays.sort(ventanaB);
|
111 |
|
112 |
pxOut[0]=ventanaR[(tamVentana-1)/2]; |
113 |
pxOut[1]=ventanaG[(tamVentana-1)/2]; |
114 |
pxOut[2]=ventanaB[(tamVentana-1)/2]; |
115 |
|
116 |
//Extraer los elementos centrales y asignarselos al pixel (x,y)
|
117 |
for(int i = col; i < width && i < (col + stepX[contX + 1]); i++) |
118 |
for(int j = line; j < height && j < (line + stepY[contY + 1]); j++) |
119 |
rasterResult.setElemFloat(j, i,pxOut); |
120 |
return;
|
121 |
} |
122 |
} |
123 |
|
124 |
// Si la ventana se sale de la imagen dejar el pixeles original
|
125 |
for(int i = col; i < width && i < (col + stepX[contX + 1]); i++) |
126 |
for(int j = line; j < height && j < (line + stepY[contY + 1]); j++) |
127 |
rasterResult.setElemFloat(j, i,px); |
128 |
} |
129 |
|
130 |
public void processLine(int y) { |
131 |
// TODO Auto-generated method stub
|
132 |
|
133 |
} |
134 |
|
135 |
public int getInRasterDataType() { |
136 |
return RasterBuf.TYPE_FLOAT;
|
137 |
} |
138 |
|
139 |
public int getOutRasterDataType() { |
140 |
return RasterBuf.TYPE_FLOAT;
|
141 |
} |
142 |
|
143 |
public Object getResult(String name) { |
144 |
if (name.equals("raster")) { |
145 |
return (Object) this.rasterResult; |
146 |
} else {
|
147 |
return null; |
148 |
} |
149 |
} |
150 |
|
151 |
public void pre() { |
152 |
exec = true;
|
153 |
this.raster = (RasterBuf) params.get("raster"); |
154 |
height = raster.getHeight(); |
155 |
width = raster.getWidth(); |
156 |
this.ladoVentana = ((Integer) params.get("ladoVentana")).intValue(); |
157 |
this.rasterResult = new RasterBuf(raster.getDataType(),width,height,raster.getBandCount(),true); |
158 |
|
159 |
super.pre();
|
160 |
} |
161 |
|
162 |
} |