aboutsummaryrefslogtreecommitdiff
path: root/lib/seg/mask_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/seg/mask_data.c')
-rw-r--r--lib/seg/mask_data.c82
1 files changed, 41 insertions, 41 deletions
diff --git a/lib/seg/mask_data.c b/lib/seg/mask_data.c
index dc3a811..52a3ac4 100644
--- a/lib/seg/mask_data.c
+++ b/lib/seg/mask_data.c
@@ -4,9 +4,9 @@
#include <stdio.h>
// Allocate Mask Data for Label
-struct MaskData* create_mask_data(ImageMaskData_t label)
+MaskData* create_mask_data(ImageMaskData_t label)
{
- struct MaskData *data = (struct MaskData*)malloc(sizeof(struct MaskData));
+ MaskData *data = (MaskData*)malloc(sizeof(MaskData));
data->label = label;
data->area = 0;
data->perimeter = 0;
@@ -14,15 +14,15 @@ struct MaskData* create_mask_data(ImageMaskData_t label)
}
// Compare mask data labels
-bool_t compare_labels(struct MaskData* left, struct MaskData* right)
+bool_t compare_labels(MaskData* left, MaskData* right)
{
return left->label < right->label;
}
// Create AVL Mask node
-struct AVLNode* create_avl_mask_node(struct MaskData* data)
+AVLNode* create_avl_mask_node(MaskData* data)
{
- struct AVLNode* node = (struct AVLNode*)malloc(sizeof(struct AVLNode));
+ AVLNode* node = (AVLNode*)malloc(sizeof(AVLNode));
if (node == NULL) {
return NULL;
}
@@ -35,31 +35,31 @@ struct AVLNode* create_avl_mask_node(struct MaskData* data)
}
// Insert MaskData into the AVL Tree
-struct Result insert_mask(struct AVLNode* node, struct MaskData* data)
+Result insert_mask(AVLNode* node, MaskData* data)
{
- struct Result result;
+ Result result;
// 1. Standard BST insertion
if (node == NULL) {
- return (struct Result) {create_avl_mask_node(data), TRUE};
+ return (Result) {create_avl_mask_node(data), TRUE};
}
- struct MaskData *node_data = (struct MaskData*)node->data;
+ MaskData *node_data = (MaskData*)node->data;
if (node->compare(data, node_data)) {
result = insert_mask(node->left, data);
if (!result.success) {
fprintf(stderr, "Failed to insert!");
return result;
}
- node->left = (struct AVLNode*)result.data;
+ node->left = (AVLNode*)result.data;
} else if (node->compare(node->data, data)) {
result = insert_mask(node->right, data);
if (!result.success) {
fprintf(stderr, "Failed to insert!");
return result;
}
- node->right = (struct AVLNode*)result.data;
+ node->right = (AVLNode*)result.data;
} else {
- return (struct Result) {node, FALSE};
+ return (Result) {node, FALSE};
}
// 2. Update height of the ancestor node
@@ -71,53 +71,53 @@ struct Result insert_mask(struct AVLNode* node, struct MaskData* data)
// LeftLeft
if ((balance > 1) && node->compare(data, node->left->data)) {
- return (struct Result) {right_rotate(node), TRUE};
+ return (Result) {right_rotate(node), TRUE};
}
// RightRight
if ((balance < -1) && node->compare(node->right->data, data)) {
- return (struct Result) {left_rotate(node), TRUE};
+ return (Result) {left_rotate(node), TRUE};
}
// LeftRight
if ((balance > 1) && node->compare(node->left->data, data)) {
- return (struct Result) {right_rotate(node), TRUE};
+ return (Result) {right_rotate(node), TRUE};
}
// RightLeft
if ((balance < -1) && node->compare(data,node->right->data)) {
- return (struct Result) {left_rotate(node), TRUE};
+ return (Result) {left_rotate(node), TRUE};
}
- return (struct Result) {node, TRUE};
+ return (Result) {node, TRUE};
}
// Allocate a label's Mask data in a tree
// If it already exists, skip the allocation
-struct AVLNode* insert_mask_alloc(struct AVLNode* node, ImageMaskData_t label)
+AVLNode* insert_mask_alloc(AVLNode* node, ImageMaskData_t label)
{
- struct MaskData* data = create_mask_data(label);
- struct Result result = insert_mask(node, data);
+ MaskData* data = create_mask_data(label);
+ Result result = insert_mask(node, data);
if (!result.success) {
free(data);
}
- return (struct AVLNode*)result.data;
+ return (AVLNode*)result.data;
}
// Print AVL Node Mask Data Label
-void print_label(struct AVLNode* root)
+void print_label(AVLNode* root)
{
if (root != NULL) {
print_label(root->left);
- struct MaskData* data = root->data;
+ MaskData* data = root->data;
printf("%d: (%zu, %zu) ", data->label, data->area, data->perimeter);
print_label(root->right);
}
}
// Increase the label's area
-bool_t increase_label_area(struct AVLNode* root, ImageMaskData_t label)
+bool_t increase_label_area(AVLNode* root, ImageMaskData_t label)
{
if (root == NULL) {
return FALSE;
}
- struct MaskData* data = (struct MaskData*)root->data;
+ MaskData* data = (MaskData*)root->data;
if (data->label == label) {
data->area++;
}
@@ -131,12 +131,12 @@ bool_t increase_label_area(struct AVLNode* root, ImageMaskData_t label)
}
// Increase the label's perimeter
-bool_t increase_label_perimeter(struct AVLNode* root, ImageMaskData_t label)
+bool_t increase_label_perimeter(AVLNode* root, ImageMaskData_t label)
{
if (root == NULL) {
return FALSE;
}
- struct MaskData* data = (struct MaskData*)root->data;
+ MaskData* data = (MaskData*)root->data;
if (data->label == label) {
data->perimeter++;
}
@@ -151,9 +151,9 @@ bool_t increase_label_perimeter(struct AVLNode* root, ImageMaskData_t label)
// Increase the label's area
// Create an AVL node if it doesn't exist
-struct AVLNode* increase_label_area_alloc(struct AVLNode* root, ImageMaskData_t label)
+AVLNode* increase_label_area_alloc(AVLNode* root, ImageMaskData_t label)
{
- struct AVLNode* new_root = root;
+ AVLNode* new_root = root;
bool_t success = increase_label_area(new_root, label);
if (success == FALSE) {
new_root = insert_mask_alloc(new_root, label);
@@ -164,9 +164,9 @@ struct AVLNode* increase_label_area_alloc(struct AVLNode* root, ImageMaskData_t
// Increase the label's perimeter
// Create an AVL node if it doesn't exist
-struct AVLNode* increase_label_perimeter_alloc(struct AVLNode* root, ImageMaskData_t label)
+AVLNode* increase_label_perimeter_alloc(AVLNode* root, ImageMaskData_t label)
{
- struct AVLNode* new_root = root;
+ AVLNode* new_root = root;
bool_t success = increase_label_perimeter(new_root, label);
if (success == FALSE) {
new_root = insert_mask_alloc(new_root, label);
@@ -182,7 +182,7 @@ bool_t compare_image_mask_data_t(ImageMaskData_t* s1, ImageMaskData_t* s2)
}
// In-order traversal print pointer
-void print_in_order_image_mask_data_t(struct AVLNode* root)
+void print_in_order_image_mask_data_t(AVLNode* root)
{
if (root != NULL) {
print_in_order_image_mask_data_t(root->left);
@@ -192,7 +192,7 @@ void print_in_order_image_mask_data_t(struct AVLNode* root)
}
// Check if ImageMaskData_t in AVLTree with ImageMaskData_t* data
-bool_t in_image_mask_data_t_tree(struct AVLNode* root, ImageMaskData_t value)
+bool_t in_image_mask_data_t_tree(AVLNode* root, ImageMaskData_t value)
{
if (root == NULL) {
return FALSE;
@@ -208,15 +208,15 @@ bool_t in_image_mask_data_t_tree(struct AVLNode* root, ImageMaskData_t value)
// Filter out small masks
// Assumption: Contiguous labeling
-struct AVLNode* get_small_labels(struct AVLNode* removal_tree, struct AVLNode* label_tree, size_t min_area, size_t min_perimeter)
+AVLNode* get_small_labels(AVLNode* removal_tree, AVLNode* label_tree, size_t min_area, size_t min_perimeter)
{
- struct AVLNode* return_tree = removal_tree;
+ AVLNode* return_tree = removal_tree;
if (label_tree != NULL) {
return_tree = get_small_labels(return_tree, label_tree->left, min_area, min_perimeter);
- struct MaskData* node_data = (struct MaskData*)label_tree->data;
+ MaskData* node_data = (MaskData*)label_tree->data;
if ((node_data->area < min_area) || (node_data->perimeter < min_perimeter)) {
// Insert
- struct Result result = avl_insert(return_tree, &node_data->label, (bool_t (*)(void*,void*))compare_image_mask_data_t);
+ Result result = avl_insert(return_tree, &node_data->label, (bool_t (*)(void*,void*))compare_image_mask_data_t);
if (result.success) {
return_tree = result.data;
}
@@ -227,9 +227,9 @@ struct AVLNode* get_small_labels(struct AVLNode* removal_tree, struct AVLNode* l
}
// Get mask label data
-struct AVLNode* get_mask_data(ImageMaskData_t* masks, uint32_t width, uint32_t height)
+AVLNode* get_mask_data(ImageMaskData_t* masks, uint32_t width, uint32_t height)
{
- struct AVLNode* root = NULL;
+ AVLNode* root = NULL;
for (size_t y = 0; y < height; y++) {
for (size_t x = 0; x < width; x++) {
size_t coord = x + y*width;
@@ -247,8 +247,8 @@ struct AVLNode* get_mask_data(ImageMaskData_t* masks, uint32_t width, uint32_t h
// Filter out small masks in mask
void filter_small_masks(ImageMaskData_t* masks, uint32_t width, uint32_t height, size_t min_area, size_t min_perimeter)
{
- struct AVLNode* root = get_mask_data(masks, width, height);
- struct AVLNode* small_label_tree = NULL;
+ AVLNode* root = get_mask_data(masks, width, height);
+ AVLNode* small_label_tree = NULL;
small_label_tree = get_small_labels(NULL, root, min_area, min_perimeter);
for (size_t y = 0; y < height; y++) {
for (size_t x = 0; x < width; x++) {