问题:我有两个重叠的 2D 形状,A 和 B,每个形状具有相同数量的像素,但形状不同。形状的某些部分是重叠的,并且每个形状都有一些不重叠的部分。我的目标是将形状 A 中的所有非重叠像素移动到形状 B 中的非重叠像素。由于每个形状中的像素数相同,我应该能够找到 1 对 1 的映射像素。限制是我想找到最小化所有移动像素行进的总距离的映射。
蛮力:解决这个问题的蛮力方法显然是不可能的,因为我必须计算我认为有 n 的所有可能映射的总距离!(其中 n 是一个形状中的非重叠像素的数量)乘以计算映射中每对点的距离的计算,n,总共得到 O(n * n!) 或类似的东西。
回溯:我能想到的唯一“更好”的解决方案是使用回溯,我将在其中跟踪当前的最小值,并且在我评估某个映射时的任何时候,如果我达到或超过该最小值,我继续下一个映射。即使这样也不会比 O(n!) 做得更好。
有没有办法以合理的复杂性解决这个问题?
另请注意,简单地将一个点映射到它的最近匹配邻居的“明显”方法并不总是产生最佳解决方案。
更简单的方法?:作为次要问题,如果不存在可行的解决方案,一种可能性可能是将每个不重叠的部分划分为小区域,并映射这些区域,从而大大减少映射的数量。为了计算两个区域之间的距离,我将使用质心(区域中像素位置的平均值)。但是,这提出了我应该如何进行分区以获得接近最佳答案的问题。
任何想法表示赞赏!