如何用尽可能少的矩形填充笛卡尔格子上的二维集?

计算科学 优化 几何学 数据管理
2021-12-05 01:18:43

假设我有一个包含不规则非凸形状的黑白图像(由二维笛卡尔数组中的二进制像素值组成)。让我们进一步假设该形状是一个连通区域。我不想存储每个单独的像素位置(这对于非常大的图像可能成本太高),我想将完全相同的图像表示为一组“空间填充”矩形。这样做时,每个矩形可以由它的两个对映角点表示。因此,不需要存储矩形内每个点的信息:我们只需要存储矩阵坐标(i,j)的两个相对角点。

有很多方法可以用矩形填充空间。所以,我的问题是:

  1. 如何用最少的矩形填充空间?(最小的数据压缩)
  2. 如何在多项式时间内找到这组最佳的空间填充矩形?(或者这个问题是 NP 难的?)
3个回答

实际上,我在这里找到了答案。感谢您的帮助...

域的边界恰好有两种类型的角:凸 90 度角和凹 90 度角。为了用不重叠的矩形填充域,只有凹角很重要。(我不知道怎么上传图片,不好意思。)在每个凹角处,我们必须在x-或y-方向有一个“切口”。每个“切口”都会添加一个矩形,除非“切口​​”恰好在另一个凹角处结束。

编辑根据其他答案中给出的参考修复了建议的解决方案。

因此,我们定义了一个二分图,其中凹角之间的轴平行“切割”作为节点。如果相应的“切口”彼此相交或具有共同的角,则两个节点由一条边连接。该图中的最大独立集(它们之间没有边的一组节点)将转化为原始问题的解决方案。这样的集合可以从二分图的最大匹配中导出。(这可能与 Dulmage-Mendelsohn 分解有关。)

我没有仔细考虑过,但我认为基本算法会这样工作:

  • 找出任意一个中唯一边的数量x或者y方向。
  • 取边数较少的方向。不失一般性,我们假设x这里。
  • 对于每个这样的边,连接(xmin,y1)(xmin,y2), 画出最大可能的矩形,延伸到终止于直线x=xmax.
  • 对尚未被矩形覆盖的“另一”侧(例如,向右移动)上的所有边重复此过程。

这应该涵盖整个域,但有可能从左侧或右侧开始重叠。然而,在任何一个中的唯一边的数量x或者y方向作为矩形数量的上限。