algorithm - 查找两个图像之间的图像子集

标签 algorithm image-processing opencv textures

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

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

最佳答案

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

它必须是实时的吗?如果不是,那么您可以使用适应度函数进行简单的 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
}

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

关于algorithm - 查找两个图像之间的图像子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7366691/

相关文章:

arrays - 找到数组的不相交序列的最大总和

image - 查找嘈杂图像中的点数

c++ - QImage::setPixel: 坐标超出范围

opencv - 如何使用cuda tex2D访问像素的每个 channel

Python - 图像上单一颜色的矩形轮廓

c++ - 有没有办法为 cv QueryFrame 或 cv GrabFrame 设置起始帧?

algorithm - 无向图中的 Push-Relabel 最大流算法

algorithm - 如何从线角度获取点 X、Y 坐标?

algorithm - 在不到 O(n) 的时间内搜索与模式 "abc:*:xyz"匹配的字符串

c++ - 我如何使用 opencv 将这张图片分成两行?