我们假设我们有以下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中的快速/无错实现!
答案 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。