使用具有C ++问题的kd树对图像进行分区

时间:2018-11-03 12:59:10

标签: c++ image binary partitioning

我正在尝试将图像划分为多个区域,并使用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]的1d数组的指针。这用于计算区域位置和坐标。主要功能是通过发送图像的宽度,高度和0,0数组开始该递归,以开始分区。

0 个答案:

没有答案
相关问题