aboutsummaryrefslogtreecommitdiff
path: root/src/filters.c
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2010-01-21 15:36:44 +0100
committerThomas White <taw@physics.org>2010-01-21 15:36:44 +0100
commit552d860fa1bf4fd699d0af2e8ca0a13345fc624b (patch)
tree0185aa85891d64cd7c521dba06dc04d67c757ccf /src/filters.c
parent395b2bd7770fb9a9f11be939c22d7abce702e4da (diff)
Fix hdfile layering violations
Diffstat (limited to 'src/filters.c')
-rw-r--r--src/filters.c97
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);
+
+ }
+ }
+}