找到图像中最大的凸黑区域

时间:2011-09-07 10:06:01

标签: algorithm image pattern-finding

我的图像是一个小切口:

Image with a lot of white and black pixels

正如您所看到的,它是黑色背景上的白色像素。我们可以在这些像素(或更好的点)之间绘制虚线。通过这些线,我们可以将区域包围起来。

如何在此图片中找到最大的convex黑色区域,其中不包含白色像素?

这是一个小手绘的例子,我的意思是最大的凸黑区域:

Small example

P.S。:图像不是噪声,它代表水平排列的10000000以下的素数。

5 个答案:

答案 0 :(得分:11)

我将描绘一个正确的多时间算法。毫无疑问,有待进行数据结构改进,但我相信,对于搜索非常大的数据集(或者,可能是包含该数据集的框的维度的特殊上限),需要更好地理解这个问题。多边形)。

主循环包括猜测最大凸多边形中的最低点p(打破有利于最左边点的关系),然后计算可以用p和点q的最大凸多边形,使得(qy> py )|| (q.y == p.y&& q.x> p.x)。

动态程序依赖于与Graham's scan相同的几何事实。假设不失一般性p =(0,0)并按照它们与x轴的逆时针角度的顺序对点q进行排序(通过考虑它们的点积的符号来比较两个点)。令排序顺序为q 1 ,...,q n 。设q 0 = p。对于每个0≤i<0。 j≤n,我们将计算点q 0 上的最大凸多边形,q 1 的子集,...,q i - 1 ,q i ,q j

i = 0的基本情况很容易,因为唯一的“多边形”是零区域段q 0 q j 。归纳地,为了计算(i,j)条目,我们将尝试,对于所有0≤k≤i,用(i,j)扩展(k,i)多边形。我们什么时候能这样做?首先,三角形q 0 q i q j 不得包含其他点。另一个条件是角度q k q i q j 最好不要是右转(再次检查符号适当的点积。)

最后,返回找到的最大多边形。为什么这样做?不难证明凸多边形具有动态程序所需的最优子结构,并且程序正好考虑那些满足格雷厄姆凸性特征的多边形。

答案 1 :(得分:10)

尝试找到最大凸区域是一项艰巨的任务。你能不能找到最大面积的矩形?这个问题要容易得多,并且可以用O(n) - 像素数的线性时间来解决。该算法如下。

假设你想要找到最大的自由(白色)像素矩形(对不起,我有不同颜色的图像 - 白色相当于你的黑色,灰色相当于你的白色)。

enter image description here

您可以通过两次线性O(n)时间算法(n为像素数)非常有效地执行此操作:

1)在第一次传递中,按列从下到上依次为每个像素表示可用的连续像素数:

enter image description here

重复,直到:

enter image description here

2)在第二次传递中,按行排行,阅读current_number。对于每个数字k,请跟踪>= k的连续数字的总和(即高度k的潜在矩形)。关闭k > current_number的总和(潜在矩形)并查看总和(〜矩形区域)是否大于当前最大值 - 如果是,则更新最大值。在每一行的末尾,关闭所有打开的潜在矩形(对于所有k)。

这样您将获得所有最大矩形。它当然与最大凸面区域不同,但可能会给你一些关于在哪里寻找最大凸面区域的提示(一些启发式)。

答案 2 :(得分:5)

您可以尝试将像素视为顶点并执行点集的Delaunay triangulation。然后,您需要找到最大的连接三角形集合,这些三角形不会创建凹形,也没有任何内部顶点。

答案 3 :(得分:2)

如果我正确理解您的问题,那么它就是连接组件标签的一个实例。例如,您可以在http://en.wikipedia.org/wiki/Connected-component_labeling

开始

答案 4 :(得分:1)

我想到了解决这个问题的方法:

在所有点的集合中生成所有可能的3点子集。这是您空间中所有三角形的集合。从此集中删除包含另一个点的所有三角形,并获得所有空三角形的集合。

对于每个空三角形,您可以将其增长到最大尺寸。也就是说,对于矩形外的每个点,您都要将其插入多边形的两个最近点之间,并检查此新三角形中是否有点。如果没有,您将记住该点及其添加的区域。对于每个新点,您要添加最大化添加区域的点。当不能再添加点时,已经构造了最大凸多边形。记录每个多边形的区域,并记住面积最大的区域。

此算法的性能至关重要的是您能否确定a)点是否位于三角形内; b)在添加某个点后多边形是否保持凸起。

我认为你可以减少b)成为a)的问题然后你只需要找到最有效的方法来确定一个点是否在三角形内。搜索空间的缩小可以通过以下方式实现:取三角形并将所有边缘增加到两个方向的无限长度。这将三角形外的区域分成6个子区域。对我们有利的是,这些次区域中只有3个可以包含符合凸性约束的点。因此,对于您测试的每个点,您需要确定它是否在凸扩展子区域中,这也是它是否在某个三角形中的问题。

整个多边形随着它的演变而接近圆形将具有越来越小的区域,这些区域仍然允许凸起的扩展。凹陷区域中的一次点不会再次成为凸扩展区域的一部分,因此您可以快速减少扩展时必须考虑的点数。此外,在测试扩展点时,您可以进一步减少可能的点列表。如果一个点被测试为假,那么它在另一个点的凹陷子区域中,因此测试点的凹陷子区域中的所有其他点不需要被考虑,因为它们也在内点的凹陷子区域中。您应该能够非常快速地缩减到可能的点列表。

当然,你还需要为每个空三角形做这个。

不幸的是,我无法保证通过添加最大的新区域,您的多边形将成为可能的最大多边形。