diff options
| -rw-r--r-- | include/lib/seg/util.h | 5 | ||||
| -rw-r--r-- | src/lib/seg/util.c | 37 | 
2 files changed, 42 insertions, 0 deletions
diff --git a/include/lib/seg/util.h b/include/lib/seg/util.h index 1fd0247..b3526dd 100644 --- a/include/lib/seg/util.h +++ b/include/lib/seg/util.h @@ -1,12 +1,17 @@  #ifndef INC_LIB_SEG_UTIL_H  #define INC_LIB_SEG_UTIL_H +#include <lib/bool.h>  #include <stdint.h>  #include <stddef.h>  // Convert x,y coords to linear coordinate  size_t xy_to_coord(size_t x, size_t y, uint32_t width, uint32_t height); +// Determine if coordinate is on a mask boundary +//  Assumes mask is (WxH) +bool_t is_on_mask_boundary(uint16_t* mask, uint32_t width, uint32_t height, size_t x, size_t y); +  // Dilate masks by one 4-connected pixel  uint16_t* dilate(uint16_t* mask, uint32_t width, uint32_t height); diff --git a/src/lib/seg/util.c b/src/lib/seg/util.c index d7b91b1..22a75cc 100644 --- a/src/lib/seg/util.c +++ b/src/lib/seg/util.c @@ -11,6 +11,43 @@ size_t xy_to_coord(size_t x, size_t y, uint32_t width, uint32_t height)    return x + y*width;  } +// Determine if coordinate is on a mask boundary +//  Assumes mask is (WxH) +bool_t is_on_mask_boundary(uint16_t* mask, uint32_t width, uint32_t height, size_t x, size_t y) +{ +  size_t starting_coord = xy_to_coord(x, y, width, height); +  size_t proposed_position; +  uint16_t current_value = mask[starting_coord]; + +  // Left neighbor +  if (x != 0) { +    proposed_position = xy_to_coord(x-1, y, width, height); +    if (mask[proposed_position] != current_value) { +      return TRUE; +    } +  } +  // Right neighbor +  if ((x+1) != width) { +    proposed_position = xy_to_coord(x+1, y, width, height); +    if (mask[proposed_position] != current_value) { +      return TRUE; +    } +  } +  if (y != 0) { +    proposed_position = xy_to_coord(x, y-1, width, height); +    if (mask[proposed_position] != current_value) { +      return TRUE; +    } +  } +  if ((y+1) != height) { +    proposed_position = xy_to_coord(x, y+1, width, height); +    if (mask[proposed_position] != current_value) { +      return TRUE; +    } +  } +  return FALSE; +} +  // Dilate masks by one 4-connected pixel  uint16_t* dilate(uint16_t* mask, uint32_t width, uint32_t height)  {  | 
