给定2D阵列,找到其中的区域

时间:2012-02-19 16:54:51

标签: java graph

我们假设我们有以下2d数组:

2 1 2 2 1 1 
2 2 1 2 1 1 
2 1 3 2 1 1 
2 2 2 1 3 3 
2 2 1 1 3 3 
2 2 1 1 3 3 

现在,我想在上面找到连续的区域。如果两个位置之间存在路径并且它们的值相同,则它们属于连续区域。此外,路径中的所有节点也应具有相同的值。例如,我们可以将上述内容划分为以下5个区域:

A B A A D D 
A A B A D D 
A B C A D D 
A A A D E E
A A D D E E 
A A D D E E 

您可以进入所有8个方向。我正在寻找Java的实现。有人可以帮我这个。界面类似于

VectorFeature returnComp(int matrix[][])

其中VectorFeature可以如下

class VectorFeature{
  string region
  int numberForRegion
  int numOfElements

}

我知道如何实现这一点,但我正在寻找JAVA中的快速/无错实现!

2 个答案:

答案 0 :(得分:0)

你可能比在维基百科上开始做得更糟:Connected-component labeling

答案 1 :(得分:0)

这是做什么的。

首先将您的2d数组转换为(大部分)8度图,其中包含以下规则:

e(i,j)如果color_i = color_j为所有i,对于所有j在8neighbours.i

将这些边表示为邻接矩阵A

然后采用以下按元素的OR产品

C = I或A或A ^ 2或A ^ 3 OR ... A ^ k

其中C是在i处有1的or-product,如果在0-k步骤中有任何从i到j的路径,则为j。

现在,最后采取元素明智和产品

R = C AND C_transpose

R的第i行在j iff i处有一列,j属于同一个组件。然后你有了你的区域,因为它代表的唯一路径是你最初在2D数组中表示的路径。区域之间没有边缘。但是这个矩阵产品需要一段时间来计算,所以我们想要一个替代方案:

由于我没有涉及上述As的进展的的收敛的原因,我们可以选择一个可调参数alpha来使该系列收敛,我们可以找到一个近似值R by

R'=逆(I - alpha * A)

这将具有与R中相同的非零元素模式,但更容易计算。 (注意,在R中你将有1和0,在R'你将有0和非0(浮点数),所以你可以读取所有相同的区域)

你可以用Java做到这一点。但为什么不使用matlab?

这个答案几乎是逐字逐句(但不是)来自伟大的书:线性代数语言中的图形算法。作者:J Kepner和J Gilbert。