在两个图像之间查找图像子集

时间:2011-09-09 19:45:49

标签: algorithm image-processing opencv textures

我正在研究处理基于硬件的位图动画的方法。作为输入,我有一个简单位图的图像序列(它不是一个视频,它更像是简单的形状,即使它们可能包含位图填充)。我正在制作这个动画的纹理图集(所以它可以用GPU快速渲染),并且因为这个序列有时候大部分静止不动而其中一小部分是动画,我需要一个能找到它的算法两个图像之间的“共同部分”,所以我可以节省内存。

图像可能没有相同的大小(例如,如果对象正在增长或缩小),所以我需要一种方法来检测两者之间最大的公共区域。我见过this answer,它部分解决了我的问题。我想知道,如果我的情况已经有了更好的算法,特别是因为尺寸可以变化,一个图像不一定包含在另一个图像中,但我需要找到它们之间的公共部分。 2。

1 个答案:

答案 0 :(得分:1)

我看到的一个问题是,一个图像可以在很多方面包含在另一个图像中,您如何确定正确的答案?

它必须是实时的吗?如果没有,那么你可以使用适应度函数进行简单的O(n ^ 4)搜索。

适应度函数可能是图像之间的误差(给出n ^ 8算法)。

更新: 错误的分析对不起。搜索是n ^ 2,适应度函数是n ^ 2,得到n ^ 4。

整个算法看起来像这样:

w1 = width of image 1
w2 = width of image 2
h1 = height of image 1
h2 = height of image 2

for x = -w1 to w1+w2
  for y = -h1 to h1+h2
    find max fitness(x,y)

fitness(xc,yc){
  m=0
  for each x where image 1 overlaps image 2 displaced by xc
    for each y where image 1 overlaps image 2 displaced by yc
      if (image1[x][y] == image2[x+xc][y+yc])
        m += 1
  return m
}

更新:修改了适应度函数以找到重叠的数量,然后尝试找到最多的重叠。