diff options
author | Thomas White <taw@physics.org> | 2010-01-21 15:36:44 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2010-01-21 15:36:44 +0100 |
commit | 552d860fa1bf4fd699d0af2e8ca0a13345fc624b (patch) | |
tree | 0185aa85891d64cd7c521dba06dc04d67c757ccf /src/filters.c | |
parent | 395b2bd7770fb9a9f11be939c22d7abce702e4da (diff) |
Fix hdfile layering violations
Diffstat (limited to 'src/filters.c')
-rw-r--r-- | src/filters.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/filters.c b/src/filters.c new file mode 100644 index 00000000..235d2822 --- /dev/null +++ b/src/filters.c @@ -0,0 +1,97 @@ +/* + * filters.c + * + * Image filtering + * + * (c) 2006-2010 Thomas White <taw@physics.org> + * + * Part of CrystFEL - crystallography with a FEL + * + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> +#include <math.h> +#include <string.h> +#include <assert.h> +#include <gsl/gsl_statistics_int.h> + +#include "image.h" + + +static int compare_vals(const void *ap, const void *bp) +{ + const signed int a = *(signed int *)ap; + const signed int b = *(signed int *)bp; + + if ( a > b ) return 1; + if ( a < b ) return -1; + return 0; +} + + +static void clean_panel(struct image *image, int sx, int sy) +{ + int x, y; + const int s = sizeof(signed int); + + for ( y=0; y<128; y++ ) { + + signed int vals[512]; + double m; + + for ( x=0; x<512; x++ ) { + vals[x] = image->data[(x+sx)+(y+sy)*image->width]; + } + + qsort(&vals[0], 512, s, compare_vals); + + m = gsl_stats_int_median_from_sorted_data(vals, 1, 512); + + for ( x=0; x<512; x++ ) { + image->data[(x+sx)+(y+sy)*image->width] -= m; + } + + } + + for ( x=0; x<512; x++ ) { + + signed int vals[128]; + double m; + + for ( y=0; y<128; y++ ) { + vals[y] = image->data[(x+sx)+(y+sy)*image->width]; + } + + qsort(&vals[0], 128, s, compare_vals); + + m = gsl_stats_int_median_from_sorted_data(vals, 1, 128); + + for ( y=0; y<128; y++ ) { + image->data[(x+sx)+(y+sy)*image->width] -= m; + } + + } +} + + +/* Pre-processing to make life easier */ +void clean_image(struct image *image) +{ + int px, py; + + if ( (image->width != 1024) || (image->height != 1024) ) return; + + for ( px=0; px<2; px++ ) { + for ( py=0; py<8; py++ ) { + + clean_panel(image, 512*px, 128*py); + + } + } +} |