35static void sortm (
float ia[],
int ib[],
int n);
36static void quicksort (
float x[],
int point[],
int l,
int nfilt);
37static void filt1d(
float [],
int,
int);
38static void padext(
float [],
int);
39static void hanning(
float [],
int);
78 ybuf = (
float *) cpl_malloc(MAX(nx,ny) *
sizeof(float));
79 save = (
float *) cpl_malloc((nx+1) * ny *
sizeof(float));
83 for(k = 0; k < ny; k++) {
84 for(j = 0; j < nx; j++) {
85 save[(nx+1)*k+j] = xbuf[k][j];
88 filt1d(ybuf, nx, mfilt);
89 for(j = 0; j < nx; j++) xbuf[k][j] = ybuf[j];
93 for(k = 0; k < nx; k++) {
94 for(j = 0; j < ny; j++) ybuf[j] = xbuf[j][k];
95 filt1d(ybuf, ny, mfilt);
96 for(j = 0; j < ny; j++)
98 if(save[(nx+1)*j+k] > -1000.0)
99 xbuf[j][k] = MIN(save[(nx+1)*j+k], ybuf[j]);
103 for(k = 0; k < ny; k++) {
104 for(j = 0; j < nx; j++) ybuf[j] = xbuf[k][j];
106 for(j = 0; j < nx; j++) xbuf[k][j] = ybuf[j];
110 for(k = 0; k < nx; k++) {
111 for(j = 0; j < ny; j++) ybuf[j] = xbuf[j][k];
113 for(j = 0; j < ny; j++) xbuf[j][k] = ybuf[j];
117 cpl_free((
void *) ybuf);
118 cpl_free((
void *) save);
125static void filt1d (
float ybuf[],
int mpt,
int mfilt) {
129 wbuf = (
float *) cpl_malloc(mpt *
sizeof(
float));
133 for(i = 0; i < mpt; i++){
134 if(ybuf[i] > -1000.0){
140 cpl_free((
void *) wbuf);
143 imcore_median(wbuf, irc, mfilt);
145 for(i = 0; i < mpt; i++){
146 if(ybuf[i] > -1000.0){
153 cpl_free((
void *) wbuf);
159static void padext (
float x[],
int n) {
160 int i, j, ilow, ihih=0, ic;
161 float xlow, xhih, slope, t1 ,t2;
164 while(i < n && x[i] <= -1000.0) i++;
166 for(i = ilow+1; i < n; i++){
167 if(x[i] <= -1000.0) {
170 while(x[i+ic] <= -1000.0) {
179 for(j = 0; j < ic; j++){
180 t2 = ((float) j+1)/((float) ic+1);
182 x[i+j] = t1*xlow+t2*xhih;
192 slope = x[ilow+1]-x[ilow];
195 for(i = 0; i < ilow; i++) x[i] = x[ilow]-slope*(ilow-i);
199 slope = x[ihih]-x[ihih-1];
202 for(i = ihih+1; i < n; i++) x[i] = x[ihih]+slope*(i-ihih);
208static void hanning (
float xbuf[],
int npt) {
210 float sum = 0.0, xmns, xmnf;
211 int nfilt = 3, i, il, ilow, nelem;
218 ilow = MAX(3,nfilt/4);
219 ilow = (ilow/2)*2 + 1;
221 for(i = 0; i < ilow; i++)
224 xmns = sum/((float) ilow);
227 for(i = 0; i < ilow; i++)
228 sum += xbuf[npt-1-i];
230 xmnf = sum/((float) ilow);
235 ybuf = (
float *) cpl_malloc(nelem *
sizeof(
float));
240 for(i = 0; i < il; i++) {
241 ybuf[i] = 2.0 * xmns - xbuf[il+ilow-1-i];
242 ybuf[npt+i+il] = 2.0 * xmnf - xbuf[npt-i-ilow-1];
245 for(i = 0; i < npt; i++)
246 ybuf[i+il] = xbuf[i];
249 for(i = 0; i < npt; i++)
250 xbuf[i] = 0.25 * (ybuf[i] + 2.0 * ybuf[i+1] + ybuf[i+2]);
252 cpl_free((
void *) ybuf);
257extern void imcore_median (
float xbuf[],
int npt,
int nfilt) {
261 int nfo2p1, i, il, ilow, j, jl, jh, nelem, l=0;
263 if((nfilt/2)*2 == nfilt) nfilt++;
264 if(npt <= nfilt)
return;
269 ybuf = (
float *) cpl_malloc(nelem *
sizeof(
float));
272 array = (
float *) cpl_malloc(nfilt *
sizeof(
float));
273 point = (
int *) cpl_malloc(nfilt *
sizeof(
int));
279 ilow = MAX(3, nfilt/4);
280 ilow = (ilow/2)*2 + 1;
282 for(i = 0; i < ilow; i++) array[i] = xbuf[i];
283 sortm(array, point, ilow);
284 xmns = array[ilow/2];
286 for(i = 0; i < ilow; i++) array[i] = xbuf[npt-1-i];
287 sortm(array, point, ilow);
288 xmnf = array[ilow/2];
291 for(i = 0; i < il; i++) {
292 ybuf[i] = 2.0 * xmns - xbuf[il+ilow-1-i];
293 ybuf[npt+i+il] = 2.0 * xmnf - xbuf[npt-i-ilow-1];
295 for(i = 0; i < npt; i++) ybuf[i+il] = xbuf[i];
298 for(i = 0; i < nfilt; i++) {
303 sortm(array, point, nfilt);
305 xbuf[0] = array[nfo2p1];
308 for(j = jl; j < jh; j++) {
310 for(i = 0; i < nfilt; i++) {
319 quicksort(array, point, l, nfilt);
320 xbuf[j-jl+1] = array[nfo2p1];
324 cpl_free((
void *) point);
325 cpl_free((
void *) array);
326 cpl_free((
void *) ybuf);
329static void sortm (
float ia[],
int ib[],
int n) {
330 int i,j, ii, jj, ifin, iu;
334 while(jj < n) jj = 2 * jj;
335 jj = MIN(n,(3 * jj)/4 - 1);
339 for(ii = 0; ii < ifin; ii++) {
342 if(ia[i] <= ia[j])
continue;
358static void quicksort (
float x[],
int point[],
int l,
int nfilt) {
360 int i, it, j, npt, ii;
364 for(i = 0; i < nfilt; i++) {
365 if(i != l && test <= x[i]) {
370 if(j - 1 == l)
return;
376 for(i = 0; i < npt; i++) {
379 point[ii+1] = point[ii];
390 for(i = 0; i < npt; i++) {
393 point[ii-1] = point[ii];
void imcore_bfilt(float **xbuf, int nx, int ny)
Do bilinear median and linear filtering on background values.