00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SCALE_SPACE_FILTER_H
00023 #define SCALE_SPACE_FILTER_H
00024
00025 #include "GaussianBlur.h"
00026 #include "CUDASegmentation.h"
00027
00028 enum MERGE_POLICY {
00029 MERGE_HILL_CLIMB,
00030 MERGE_WATERSHED_HILL_CLIMB,
00031 MERGE_WATERSHED_OVERLAP
00032 };
00033
00034 template <typename GROUP_T, typename IMAGE_T>
00035 class ScaleSpaceFilter {
00036 public:
00037
00038 ScaleSpaceFilter(int w,
00039 int h,
00040 int d,
00041 long nGroups,
00042 float initial_blur_sigma,
00043 float blur_multiple,
00044 bool use_cuda);
00045
00046 ~ScaleSpaceFilter();
00047
00048 long merge(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian, MERGE_POLICY policy);
00049
00050 long merge_with_watershed(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian);
00051
00052 private:
00053 int width;
00054 int height;
00055 int depth;
00056 long heightWidth;
00057 long nVoxels;
00058 long nGroups;
00059 float blur_multiple;
00060 float current_blur;
00061 bool use_cuda;
00062 gpuseg_temp_storage gpu_seq_tmp;
00063 gpuseg_temp_storage gpu_scanwork_tmp;
00064 gpuseg_temp_storage gpu_grpmaxidx_tmp;
00065
00066 unsigned long* max_idx;
00067 GROUP_T* group_map;
00068
00069 long find_local_maxima(long curr_idx, IMAGE_T* image);
00070
00071 long sequentialize_group_nums(GROUP_T* segments, long max_group_num);
00072
00073 long sequentialize_group_nums_cpu(GROUP_T* segments, long max_group_num);
00074
00075 void find_groups_max_idx(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian);
00076
00077 void find_groups_max_idx_cpu(GROUP_T* segments, IMAGE_T* image);
00078
00079 void watershed_overlap_merge_cpu(GROUP_T* segments, GROUP_T* new_segments);
00080
00081 void watershed_hill_climb_merge_cpu(GROUP_T* segments, GROUP_T* new_segments, IMAGE_T* image);
00082
00083 void hill_climb_merge_cpu(GROUP_T* segments, IMAGE_T* image);
00084
00085 void watershed_overlap_merge(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian);
00086
00087 void watershed_hill_climb_merge(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian);
00088
00089 void hill_climb_merge(GROUP_T* segments, GaussianBlur<IMAGE_T>* gaussian);
00090
00091 template <typename ARRAY_T>
00092 ARRAY_T* allocate_array(long num_elements);
00093
00094 template <typename ARRAY_T>
00095 void free_array(ARRAY_T*& arr);
00096
00097 };
00098
00099 #endif