2010-07-30 92 views
0

我试图解决以下问题(线性回归分类):测量矩形

考虑,比如说输入,

0000000000000000 
0011111111110000 
0011111111110000 
0011111111110000 
0000000000000000 
0000000111111110 
0000000111111110 
0000000000000000 

我需要查找字段中所有矩形的宽度和高度。实际上,输入实际上是单个列(认为就像扫描仪从左向右移动一样),并且在程序持续期间是连续的(即扫描列不移动,但矩形在其上移动)。在这个例子中,我可以'等待一个矩形开始'(也就是说,注意零点变为1s),然后观察它结束(一个回零)并且以'网格单位'来测量该部分。这将工作的优良上述的简单情况,但会失败的矩形以一定的角度倾斜,例如:

0000000000000000 
0000011000000000 
0000111100000000 
0001111111000000 
0000111111100000 
0000011111110000 
0000000111100000 
0000000011000000 

我原本以为以下问题将适用:

Dynamic programming - Largest square block

但现在我不太确定。

我没有什么用回归或回归测试没有经验,但我认为我可以代表这是8个变量的输入.....

嗯,老实说我不知道​​我是怎么完全可以做到这一点。这部分代码提取的大小需要与已知大小的矩形(即从数据库中)进行拟合。

我最初认为我可以将已知数据作为训练练习并存储积极的测试结果,但我真的不知道该从哪里出发。

感谢您的任何建议。

+0

是有可能的是,矩形重叠? – ULysses 2010-07-30 14:57:54

+0

第二个输入不是矩形。矩形有四个直角。 – NullUserException 2010-07-30 14:58:08

+0

他刚刚旋转矩形,没有歪斜! – Martin 2010-07-30 15:00:32

回答

2

在扫描时收集转换点(从1到0或相反),然后直接从那里或从每个对象的凸包中计算长度和宽度。

如果矩形可以重叠,那么你会有更大的问题。

+0

凸面船体,谢谢,绝对是我应该看的东西。 – 2010-07-30 15:29:43

0

我提出这个问题的朋友,他建议:

  1. 看到一个1时,第一次,它存储为一个新的形状。 Flood将其填充到右侧,并将这些点添加到相同的形状。
  2. 现在不在形状中的任何输入像素都是新形状。做相同的洪水填充。
  3. 在下一个输入列上,从原始形状点再次泛光。将新像素添加到相应的形状
  4. 如果任何泛光填充不为两个连续列添加任何新像素,则表示完成了形状。继续前进,并尝试确定它的尺寸

然后,我们将获得我们隔离的形状的尺寸(如示例2中所示)。

对于这一点,我们想了起来:

  1. 如果形状最左边的像素数低于平均每列像素,那么peice的可能是旋转。因此,通过获取最外面的像素来找到角点。使用它们之间的距离公式。最大=斜边,其他=宽度或高度。
  2. 否则,此peice的可能是完全一致的,所以边角可能只是在左上最像素,底部最右边的像素等

你怎么都认为?

1

我会采取以下步骤:

  1. 得到所有列一起在一个矩阵(这是需要进行适当的过滤)
  2. 现在应用过滤器(需要谷歌有点)磨砺棱角
  3. 创建一些结构来保存下一个步骤的数据(这可以有很多不同的解决方案,选择自己喜欢的和/或最佳)
  4. 扫描垂直(逐列),以及随之而来的“1”的每一段找到一列(段意味着你已经发现它的开始结束结束y坐标)做:
    1. 检查,这部分重叠在前一列
    2. 一些段,如果没有的话,认为这是一个新的矩形。创建一个rect对象并将其句柄分配给该段。新RECT,update it's metrics(此操作只需段的坐标 - xyminymax,并且将在后面讨论)
    3. ,如果是的话,假设这是相同的矩形,以矩形的手柄,该手柄分配给那么当前段获得通过RECT它的处理和update it's metrics

这是相当的。在此之后,您将有一个rect对象池,每个对象都有四个角落坐标。做一些原始的数学来近似矩形的宽度和高度。
那么魔术?那么,这一切都发生在update rect metrics例程中。

对于每个RECT我们有13个指标:

  • 分钟X => YMIN1,ymax1
  • 最大X => YMIN2,ymax2
  • 分钟Y => xmin1,xmax1
  • 最大ÿ => xmin2,xmax2
  • 平均垂直段长度

首先我们必须DET呃,如果这个矩形在我们的扫描网格内正确对齐。要做到这一点,我们比较average vertical segment lengthmax Y - min Y。如果它们是相同的(我会选择一个门槛在97%左右,然后调整它,最好的结果),那么我们承担我们的矩形坐标如下:

  1. (最小X,最大Y)
  2. (min X,min Y)
  3. (max X,max Y)
  4. (max X,min Y)。

在其它情况下,出矩形被旋转并且在这种情况下,我们把它坐标如下:

  1. (分钟X,(YMIN1 + ymax1)/ 2)
  2. ((xmin1 + xmax1 )/ 2,最小Y)
  3. (最大X,(YMIN2 + ymax2)/ 2)
  4. ((xmin2 + xmax2)/ 2,最大值Y)