假设我有两张相同尺寸的图片A
和B
。假设我还有两包2D段的bag_A
和bag_B
段,分别来自图像A和B.
2D段被定义为图像上的一组位置(像素),并且可以用与原始图像大小相同的二进制图像来表示,其中如果像素是像素,则像素是true
在段内,如果在外,则为false
。
假设我想查看bag_A
中哪些段与来自bag_B
的段重叠,并将结果编码为邻接矩阵,以便:
adjacency_matrix(segment_from_A,segment_from_B)
为true
。adjacency_matrix(segment_from_A,segment_from_B)
为false
。我的问题是,快速计算这种邻接矩阵的有效方法是什么?
假设我将N
和M
分别定义为bag_A
和bag_B
中的细分百分比。有没有办法平均计算 less <{1}}“的邻接矩阵?” (例如,在空间和大小上分段均匀分布)?如果是这样,怎么样?
我到目前为止:
我相信有一种方法可以通过O(N*M)
执行此操作,可能是通过预处理数据将段分配到存储桶中。我想我可以为每个图像上的每个位置定义一个存储桶,其中该图像中的两个或多个段重叠。然后我可能只计算两个图像之间的桶之间的邻接关系,从那里,我可以以某种方式“直接”得到hashing
和bag_A
之间的邻接关系。但是,我不确定这是否可行(我可能会尽快尝试),或者如何估计它的预期运行时间。
此外,何时值得通过散列来计算邻接而不是直接比较所有可能的对?
奖励:实施规范
我最终正在寻找一种可以在MATLAB中运行的解决方案。
答案 0 :(得分:1)
第一印象:在最低级别,我将段数据编码为整数(或整数数组)中的位,并将最终比较作为AND运算实现,以确定它们是否重叠。
对于更高级别的优化,为了减少比较次数,我将为段位图构建四叉树,其中四叉树中存在的分支表示在位图的该象限中的任何位置都存在真位(等等)递归地降低到某个任意最小值)。如果你愿意,你可以像编码每个四叉树分支中的真实位数一样变得更加漂亮。
然后我会对四叉树进行散列以获得桶。在一个存储桶中,如果四叉树不匹配,您可以快速排除不匹配的内容。最后,我将使用低级AND操作来查找实际重叠的操作。