Я относительно новичок в 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;
}