我实现了一些相互信息和 Kullback-Leibler 距离来发现 Facades 中的相似性。它工作得很好,这里解释了它是如何工作的:
基于图像的立面程序建模
论文中解释了整个步骤。但它们不是为了图像的相似性,而是为了图像部分的对称性。但也许它也适用于图像比较。好吧,这只是想法,也许它有效,您应该尝试。一个认为我真正看到问题的地方是旋转。我不认为这个过程是旋转不变的。也许您应该为您的问题寻找一些视觉信息检索技术。
首先,您必须计算互信息。为此,您创建了一个大小为 256 x 256 的累加器数组。为什么是这个大小?首先是每个灰色的联合分布,然后是边缘分布。
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 快速实现