aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/lib/seg/util.h5
-rw-r--r--src/lib/seg/util.c37
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)
{