0

我将两个直方图转换为整数数组,现在我有两个大小为 array1[65536] 和 array2[65536] 的数组,其中不同索引处的值范围为 0 -255。现在我想匹配两个这样的数组,这样我就可以得到这两个图像匹配多少的结果??????请尽快帮助我。

4

3 回答 3

1

你不能。

图像直方图为您提供给定颜色在图像中出现的次数。将图像 A 想象为 25 像素的黑色垂直线,将图像 B 想象为 5x5 像素的黑盒图像。

A 和 B 都有完全相同的直方图,但显然不是相似的图像。

于 2013-04-11T18:31:34.197 回答
1

好吧,您无法比较图像是否匹配。正如 Tergiver 所说,图像直方图是图像中色调(亮度)分布的图形表示。

如果您想比较您的直方图并检查它们之间的差异,您可以按照以下示例进行操作(这是一个包含 5 个元素大小的数组的示例,只是为了简化):

int[] array1 = {0,255,100,200,78 };
int[] array2 = {255, 0, 250, 15, 34 };
float[] diff = new float[5];
for (int i = 0; i < 5; i++)
{
    diff[i] = ((float)Math.Abs(array1[i] - array2[i])) / 255;
}

float degreeOfDiff = diff.Sum()/array1.Length*100;
bool sameDistribution = degreeOfDiff == 0;

Debug.WriteLine(degreeOfDiff + "%");
Debug.WriteLine(sameDistribution);

我要强调的是,这不会检查图像是否相等。

于 2013-04-11T18:42:56.883 回答
0

这个问题有点含糊,但如果你想要的是对称差异,那么这里有一个单行 LINQ 查询:

int[] foo = new int[] { 1,2,3 };
int[] bar = new int[] { 4,5,6 };

int distance = foo.Zip(bar, (x,y)=>Math.Abs(x-y)).Aggregate( (x,y)=>x+y );

Console.WriteLine("Symmetric difference between foo and bar: {0}", distance);

可能有更好的方法来计算相似度。这在很大程度上取决于您要考虑“相似”的图像。我怀疑您还可以使用较小的阵列(即将相似的色调放在一起)获得更好的结果,以便“几乎”相同颜色的图像与“相似”记录。

编辑:看起来地球移动器的距离就是你想要的:维基百科的页面将图像比较列为 EMD 的一个很好的应用程序。

EMD 在计算机科学中的早期应用是比较两个可能因抖动、模糊或局部变形而不同的灰度图像。 [4] 在这种情况下,区域是图像的域,光(或墨水)的总量是要重新排列的“污垢”。

EMD 广泛用于基于内容的图像检索,以计算两个数字图像的颜色直方图之间的距离。在这种情况下,区域是 RGB 颜色立方体,每个图像像素都是“污垢”的包裹。相同的技术可用于任何其他量化像素属性,例如亮度、梯度、视频帧中的视在运动等。

Wikipedia 页面还包含用于计算 EMD 的算法的伪代码,我相信这是您问题的正确答案。

于 2013-04-11T18:42:10.193 回答