Quadtree: реализация в C и как ее заполнить (сжатие изображения) - PullRequest
0 голосов
/ 30 апреля 2020

Я относительно новичок в C, и мне нужно создать структуру Quadtree, чтобы помочь сжимать изображения. У меня есть доступ к библиотеке, которая имеет несколько полезных функций. Один из них в основном загружает изображение, а затем помещает все его пиксели в квадратную матрицу. Каждый пиксель изображения представляет цвет в цветовом пространстве CIELAB (со значениями L, A, B). К счастью, я знаю, что каждое используемое изображение будет иметь квадратные размеры со значениями высоты и ширины, равными степеням 2.

Чтобы добиться сжатия, мне нужно заполнить структуру квадродерева вышеупомянутыми элементами матрицы таким образом, что каждый лист дерева содержит «пиксель». Моя большая проблема в том, что я не могу себе представить, как это сделать. Затем, после заполнения квадродерева, мне нужно проверить похожие цвета в каждом квадранте и заменить их «средним цветом» квадранта, это вычисляется со средним значением L, A, B. Эта вторая часть действительно работает для меня, и мое основное сомнение заключается в том, как я могу поместить элементы цветовой матрицы в структуру Quadtree. У меня есть некоторый опыт в Python программировании, но C - это совершенно новый для меня зверь, и вещи, которые я бы легко сделал в Python, сложнее реализовать в C.

* 1004. * Я покажу часть кода, который у меня есть, после некоторого поиска реализаций quadtree:
typedef struct pix_color Color;

struct pix_color
{
  double L;
  double a;
  double b;
};


typedef struct image Image;

struct image
{
    /* The image is basically a matrix of colors */
    Color** pixels;
    int width;
    int height;
};

/* The two previous structs are extracted from a custom image C library,*/
/* basically after processing the input image I'll have an instance of Image, */ 
/* the matrix of colors, and my task is to transform that into a Quadtree */

typedef struct treeNode TreeNode;

struct treeNode {
  Color* c; /* If this is a leaf node, c represents the color stored
        in this leaf.  If this is not a leaf node, c is NULL.
         */
  TreeNode* nw; /* children */
  TreeNode* ne;
  TreeNode* sw;
  TreeNode* se;
  };


typedef struct quadtree QuadTree;

struct quadtree {
  TreeNode* root;  /* root of the tree */
  size_t count; /* number of nodes in the tree */
  size_t height; /* height of the tree */
  //....
};


/* create a new empty tree */
Quadtree* quadtree_init() {

  Quadtree* tree = malloc(sizeof(Quadtree));
  tree->root = NULL; 
  tree->count = tree->height = 0; 
  return tree; 
}

...