如何比较图像的两个直方图?

时间:2013-04-11 18:20:30

标签: c#

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

3 个答案:

答案 0 :(得分:1)

你不能。

图像直方图显示给定颜色在图像中出现的次数。想象一下,图像A为25像素的黑色垂直线,图像B为5×5像素的黑盒图像。

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

答案 1 :(得分: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);

可能有更好的方法来计算相似性。这在很大程度上取决于你想要考虑哪些图像“相似”。我怀疑使用较小的阵列(即将相似的阴影放在一起)也可能会得到更好的结果,这样“几乎”相同颜色的图像就会注册为“相似”。

修改:看起来Earth mover's distance就是您想要的:Wikiedia的页面列出了图像比较作为EMD的一个很好的应用。

  

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

     

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

维基百科页面也有一个计算EMD算法的伪代码,我相信这是你问题的正确答案。

答案 2 :(得分:0)

嗯,你无法比较图像是否匹配。正如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);

我会强调这将检查图像是否相等。