Разделить изображение с помощью дерева kd с вопросом C ++ - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь разделить изображение на регионы и раскрасить регион на основе его среднего цвета, используя структуру данных дерева kd. По сути, я собираюсь использовать рекурсию для разделения изображения на регионы, пока не будут выполнены определенные условия для прекращения разбиения. На данный момент единственное условие, которое я установил, состоит в том, что область не может стать меньше 10x10. После того, как я решу эту проблему, я реализую условие однородности, чтобы прекратить разделение в областях, которые однородны с точки зрения цвета. У меня проблема в том, что когда я пытаюсь визуализировать линии разбиения, он отображается неправильно.

 void drawPartLine(int dim, ColorGrid* cg, int* r)
{
if(dim == 1)
{
        int row = 0;
        int width = r[2];
        int part = r[2]/2;
       // cout << part << endl;
        int col = part;
        cout << row << " " << col << endl;

        for(int i = 0; i < r[3]; i++)
        {

            col = part +r[0];
            row = i;
            // << col << " " << row << endl;


            cg->set(row, col, Color(255 ,255, 255));
        }


}

else{

        int col = 0;
        int part = r[3]/2;
        int row = part + r[1];
        if(row >= height)
            row = height - 1;


        cout << row << " " << col << endl;
        for(int i = 0; i < r[2]; i++)
        {

             col = i;


            cg->set(row, col, Color(255 ,255, 255));
        }



}
}

void buildImageTree(int* r, ColorGrid* cg, int dim)
{
//cout << r[0] << " "<< r[1] << " "<< r[2] << " "<< r[3] << " " << endl;
//KdTreeElement<int, int> root = new KdTreeElement(r[2]*r[3]*3, ima);
int part;
//cout << "hi23" << endl;
//cout << largeEnoughRegionSize(r) << " " << homogeneous << endl;

if(largeEnoughRegionSize(r) )//&& !homogeneous(r))
{

    //if partitioning on x
    if(dim == 1)
    {

        part = r[2]/2;

        int leftWidth = r[2]/2 -1;
        int leftHeight = r[3];
        int x = r[0];
        int y = r[1];

        int* leftR = new int[4];
        leftR[2] = leftWidth;
        leftR[3] = leftHeight;
        leftR[0] = x;
        leftR[1] = y;


        //KdTreeElement left_region = new KdTreeElement(leftR, ima);
        //left_region->setDim(2);
        //Right region
         part = r[2]/2;


        int rightWidth = r[2]/2 - 1;
        int rightHeight = r[3];
         x = r[0] + part;
         y = r[1];

        int* rightR = new int[4];
        rightR[2] = rightWidth;
        rightR[3] = rightHeight;
        rightR[0] = x;
        rightR[1] = y;



        //KdTreeElement<int, int> right_region = new KdTreeElement(r[2]*[3]);
        //right_region->setDim(2);
        //right_region->setPartitioner(part);

        buildImageTree(leftR, cg, 2);
        buildImageTree(rightR, cg, 2);


    }//part on y
    else{

        part = r[3]/2;

        int leftWidth = r[2];
        int leftHeight = r[3]/2-1;
        int x = r[0];
        int y = r[1];

        int* leftR = new int[4];
        leftR[2] = leftWidth;
        leftR[3] = leftHeight;
        leftR[0] = x;
        leftR[1] = y;


        //KdTreeElement left_region = new KdTreeElement(leftR, ima);
        //left_region->setDim(1);
        //Right region
         part = r[3]/2;

        int rightWidth = r[2];
        int rightHeight =  (r[3]/2) - 1;
        x = r[0];
        y = part + r[1];
        int* rightR = new int[4];
        rightR[2] = rightWidth;
        rightR[3] = rightHeight;
        rightR[0] = x;
        rightR[1] = y;



        //KdTreeElement right_region = new KdTreeElement(rightR, ima);
        //right_region->setDim(1);

        buildImageTree(leftR, cg, 1);
        buildImageTree(rightR, cg, 1);


    }

    //Color the partitioning line
    //cg->set(r[1], r[0], Color(255 ,255, 255));
    drawPartLine(dim, cg, r);

    // colorRegion(cg, r);
    //compute the partitioning region

}


    o++;


}

Этот код выводит это изображение:

enter image description here

Сейчас я хочу, чтобы он выводил линии разбиения, которые образуют квадраты 10x10 по всему изображению. По какой-то причине это не достигается. BuildImageTree - это функция, которая создает дерево kd, которое содержит область изображения. Изображение разделено пополам рекурсивно. Переменная dim определяет, будет ли изображение разделяться по вертикали или горизонтали в зависимости от родителя. ColorGrid cg - это класс, который я буду использовать для создания визуального изображения. int * r - указатель, который указывает на одномерный массив, который содержит 4 целых числа [x, y, width, height]. Это используется для расчета местоположения региона и координат. Основная функция запускает эту рекурсию, отправляя в массиве изображения ширину, высоту и 0,0, чтобы начать разбиение.

...