diff options
author | Thomas White <taw@physics.org> | 2010-03-08 10:50:55 +0100 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2010-03-08 11:20:30 +0100 |
commit | ac6d29a0d946ebc6a539c4f9402417ca252de82f (patch) | |
tree | 3910de8c234b6d602bb33fb123e4f24dba0d0589 /src/peaks.c | |
parent | 2e09f17922cde19552d0f5140411985eadc06724 (diff) |
Tidy up and fix peak detection (carnage created by earlier refactoring)
Diffstat (limited to 'src/peaks.c')
-rw-r--r-- | src/peaks.c | 82 |
1 files changed, 50 insertions, 32 deletions
diff --git a/src/peaks.c b/src/peaks.c index 49537e79..5cbf0f17 100644 --- a/src/peaks.c +++ b/src/peaks.c @@ -308,6 +308,16 @@ void search_peaks(struct image *image) { int x, y, width, height; float *data; + double d; + int idx; + float fx = 0.0; + float fy = 0.0; + float intensity = 0.0; + int nrej_dis = 0; + int nrej_hot = 0; + int nrej_pro = 0; + int nrej_fra = 0; + int nacc = 0; data = image->data; width = image->width; @@ -327,7 +337,7 @@ void search_peaks(struct image *image) int mask_x, mask_y; int sx, sy; double max; - unsigned int did_something = 1; + unsigned int did_something; /* Overall threshold */ if ( data[x+width*y] < 800 ) continue; @@ -348,13 +358,12 @@ void search_peaks(struct image *image) /* Calculate overall gradient */ grad = dxs + dys; - if ( grad < 1000000 ) continue; + if ( grad < 100000 ) continue; mask_x = x; mask_y = y; - while ( (did_something) - && (distance(mask_x, mask_y, x, y)<50) ) { + do { max = data[mask_x+width*mask_y]; did_something = 0; @@ -376,47 +385,56 @@ void search_peaks(struct image *image) } } - } - - if ( !did_something ) { - - double d; - int idx; - float x = 0.0; - float y = 0.0; - float intensity = 0.0; - - assert(mask_x<image->width); - assert(mask_y<image->height); - assert(mask_x>=0); - assert(mask_y>=0); + /* Abort if drifted too far from the foot point */ + if ( distance(mask_x, mask_y, x, y) > 50.0 ) break; - /* Too far from foot point? */ - if ( distance(mask_x, mask_y, x, y) > 50.0 ) continue; + } while ( did_something ); - /* Isolated hot pixel? */ - if ( is_hot_pixel(image, mask_x, mask_y) ) continue; - - integrate_peak(image, mask_x, mask_y, - &x, &y, &intensity); + /* Too far from foot point? */ + if ( distance(mask_x, mask_y, x, y) > 50.0 ) { + nrej_dis++; + continue; + } - /* Check for a nearby feature */ - image_feature_closest(image->features, mask_x, mask_y, - &d, &idx); + /* Should be enforced by bounds used above. Muppet check. */ + assert(mask_x < image->width); + assert(mask_y < image->height); + assert(mask_x >= 0); + assert(mask_y >= 0); - if ( d > 15.0 ) { + /* Isolated hot pixel? */ + if ( is_hot_pixel(image, mask_x, mask_y) ) { + nrej_hot++; + continue; + } - image_add_feature(image->features, x, y, - image, intensity); + /* Centroid peak and get better coordinates */ + integrate_peak(image, mask_x, mask_y, &fx, &fy, &intensity); - } + /* It is possible for the centroid to fall outside the image */ + if ( (fx < 0.0) || (fx > image->width) + || (fy < 0.0) || (fy > image->height) ) { + nrej_fra++; + continue; + } + /* Check for a nearby feature */ + image_feature_closest(image->features, fx, fy, &d, &idx); + if ( d < 15.0 ) { + nrej_pro++; + continue; } + /* Add using "better" coordinates */ + image_add_feature(image->features, fx, fy, image, intensity); + nacc++; } } + STATUS("%i accepted, %i box, %i hot, %i proximity, %i outside frame\n", + nacc, nrej_dis, nrej_hot, nrej_pro, nrej_fra); + cull_peaks(image); } |