用于找到变换不变的两个图像之间的相似性的距离度量(旋转和缩放)强度差

时间:2014-05-12 09:53:49

标签: image python-2.7 image-processing transformation cbir

我想要一个距离测量来找到图像之间的相似性。 到目前为止我一直在尝试: 1)我使用了低级距离度量,例如归一化互相关(这基于某些阈值检索相似图像),但是它无法检索旋转或移位的图像。但是,如果特定图像的亮度降低,则即使它们是相同类型的图像也不会被检索。 2)Bhattacharya系数:它检索旋转或移位的图像,但不检测强度(亮度)降低的图像。 3)尝试使用SURF等全局功能,为旋转(30度)和变换图像提供帮助,但对强度差异的图像没有帮助。

我需要什么:我需要一个图像相似度的距离度量,它可以识别那些亮度降低的图像,这些图像都是转换(旋转和移动)的所有图像。 我想要结合这两个指标(互相关)+(Bhattacharya Coefficient)。 相互信息会帮助我解决这个问题吗?或任何人都可以建议我一个新的指标用于此问题的相似性测量。谷歌搜索广泛的问题和无关的答案。任何人都可以在这里指导我。前言谢谢。

1 个答案:

答案 0 :(得分:2)

我实施了一些mututal信息和Kullback-Leibler距离来找到Facades的相似性。它工作得很好,它的工作原理在这里解释:

Image-based Procedural Modeling of Facades

论文中解释了整个步骤。但它们不是图像的相似性,而是图像部分的对称性。但也许它也适用于图像比较。嗯它只是和想法也许它的工作,你应该尝试。人们认为我真正看到问题的地方就是轮换。我不认为这个程序是旋转不变的。也许您应该为您的问题寻找一些视觉信息检索技术。

首先,您必须计算互信息。对于thate,你创建一个大小为256 x 256的累加器数组。为什么这么大?首先是每种灰色,然后是joint distribution,然后是marginal distribution

for(int x = 0; x < width;  x++)
   for(int y = 0; y < height; y++)
   {
      int value1 = image1[y *width + x];
      int value2 = image2[y * width + x];

      //so first the joint distribution
      distributionTable[value1][value2]++;

      // and now the marginal distribution
      distributionTable[value1][256]++;
      distributionTable[256][value2]++;
   }

现在您拥有分发表,现在您可以计算Kullback-Leibler距离。

for(int x = 0; x < width;  x++)
   for(int y = 0; y < height; y++)
   {
      int value1 = image1[y *width + x];
      int value2= image2[y * width + x];

      double ab = distributionTable[value1][value2] / size;
      double a = distributionTable[value1][256] / size;
      double b = distributionTable[256][value2] / size;

      //Kullback-Leibler distance
      sum += ab * Math.log(ab / (a * b));  
   }

较小的总和表示两个图像/区域之间的相似性/对称性非常高。如果图像只有亮度差异,应该可以正常工作。也许还有其他距离不能反转。

也许你会试图使用SURF,SIFT或类似的东西。然后您可以匹配要素点。匹配结果越高,相似性越高。我认为这是一种更好的方法,因为您不必关心比例,亮度和旋转差异。它也可以通过OpenCV快速实现