我正在尝试将图像划分为多个区域,并使用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++;
}
此代码输出以下图像:
现在,我希望它输出在整个图像中形成10x10正方形的分隔线。由于某些原因,它无法完成此任务。 BuildImageTree是用于构建包含图像区域的kd树的函数。图像递归地分成两半。 dim变量确定图像是根据父对象垂直还是水平分割。 ColorGrid cg是我将用来创建视觉图像的类。 int * r是指向包含4个整数[x,y,width,height]的1d数组的指针。这用于计算区域位置和坐标。主要功能是通过发送图像的宽度,高度和0,0数组开始该递归,以开始分区。