【发布时间】:2012-08-30 07:48:55
【问题描述】:
这不是作业问题:)
我有一组散布在图像上的矩形。我想合并(创建一个联合)每组相交的矩形。如果一个矩形不与其相邻的矩形相交,则它保持不变。
问题是合并的矩形可以与以前没有考虑过的矩形相交;合并的矩形也可以与新合并的矩形相交。我想抓住那些案件。
因此,在我看来,它需要是迭代的(尝试每个矩形与集合中的每个其他矩形)和递归(再次尝试每个合并的矩形对集合,包括合并的矩形)。
我该怎么办?我正在使用 Java,但这更像是一个算法问题,而不是面向语言的问题。
谢谢!
编辑:添加相关代码以更好地说明我现在处理它的糟糕方式。
public static List<BinaryRegion> mergeRegions(List<BinaryRegion> regions)
{
List<BinaryRegion> merged = new ArrayList<BinaryRegion>();
geoModel = new GeometryFactory();
Polygon polys[] = new Polygon[regions.size()];
for (int i = 0; i < regions.size(); i++)
{
Polygon p = convertRectangleToPolygon(regions.get(i)
.getBoundingBox());
polys[i] = p;
}
System.out.println("Converted " + regions.size() + " polys");
for (int i = 0; i < regions.size(); i++)
{
System.out.println("Sending in poly " + i);
ArrayList<Polygon> result = mergePoly(polys[i], polys);
System.out.println("After run, size=" + result.size());
}
return merged;
}
private static ArrayList<Polygon> mergePoly(Polygon p, Polygon[] polys)
{
ArrayList<Polygon> merges = new ArrayList<Polygon>();
for (int i = 0; i < polys.length; i++)
{
if (p.equals(polys[i]))
System.out.println("found the exact match at " + i);
else if (p.intersects(polys[i]))
{
System.out.println("Found intersection at " + i);
System.out.println("Other poly is area "+polys[i].getArea());
Polygon u = (Polygon) p.union(polys[i]);
System.out.println("Merge size="+u.getArea());
merges.add(u);
}
else
merges.add(polys[i]);
}
return merges;
}
【问题讨论】:
-
很明显这不是一个家庭作业问题:)
-
你有多少个矩形?十?数百?百万?..
-
“创建联合”是指“创建一个覆盖两个相交矩形的矩形”,还是“创建一个看起来像两个相交矩形的几何联合的形状”?
-
几千个矩形。创建一个覆盖两个相交矩形的矩形;基本上是两者的边界框。
-
如果有一些 API 或包可以为我做这件事,我很乐意使用它。只是想完成它。
标签: algorithm image-processing geometry