1

我想比较两个图像直方图。它们如下:

h1 --> 长度为 0.4096 的双值一维向量。

h2 --> 长度为 0.4096 的双值一维向量。

我在这里使用这个 matlab 函数:

http://clickdamage.com/sourcecode/code/compareHists.m

如下:

% s = compareHists(h1,h2)
%       returns a histogram similarity in the range 0..1
%
% Compares 2 normalised histograms using the Bhattacharyya coefficient.
% Assumes that sum(h1) == sum(h2) == 1
%
function s = compareHists(h1,h2)

s = sum(sum(sum(sqrt(h1).*sqrt(h2))));

我的问题是:

是否需要多个金额?

即使上述等式中只有一个总和,也足够了..对吗?

像这样:sum(sqrt(h1).*sqrt(h2)) --> ?

有人可以解释一下上面的代码吗?另外,请告诉我,如果我使用单一金额,可以吗?

我尝试了两种方法,并为两个图像直方图得到了相同的答案。我只用了两个直方图就做到了这一点,因此想确定一下。

谢谢!

4

4 回答 4

3

通常,sum仅沿一维求和。如果你想沿多个维度求和,你要么

  • sum多次使用;或者
  • 使用线性索引减少到单个维度,然后使用sum一次:sum(sqrt(h1(:)).*sqrt(h2(:)))

在您的情况下,如果只有一个维度,是的,一个sum就足够了。

于 2013-11-14T08:41:08.773 回答
2

我相信您最初下载的代码是为处理堆叠为矩阵列的多个直方图而编写的。这是(恕我直言)多个sums 的原因。

在你的情况下,你可以只留下一个sum

你可以做得更好 - 无需任何金额

悬停在这里查看答案

s = sqrt(h1(:)')*sqrt(h2(:)); 诀窍是使用向量乘法!

于 2013-11-14T08:41:43.150 回答
2

你说的对。只需要一笔款项。但是,如果 h1 或 h2 是多维矩阵,那么您可能希望对维度求和。例如:

A=magic(4); % a 4 by 4 matrix of magic numbers.
sum(A) % returns [34,34,34,34], i.e. the sum of elements in each column.
sum(sum(A)) % returns 136, i.e. the sum of all elements in A.
于 2013-11-14T08:43:49.387 回答
1

我也没有在 3 个总和中看到任何点,但是如果您没有带直方图的向量而是一个矩阵,您将需要 2 个像这样的总和 sum(sum(sqrt(h1).*sqrt(h2)))来比较它们. 第一个将计算行的总和,第二个 - 列的总和。

于 2013-11-14T09:03:03.693 回答