【问题标题】:What is a joint histogram and a marginal histogram in image processing?什么是图像处理中的联合直方图和边缘直方图?
【发布时间】:2019-04-29 20:57:30
【问题描述】:

什么是图像处理中的联合直方图和边缘直方图,它们是如何工作的以及如何构建一个,如果可能的话,提供简单的例子。

例如,如果我有一个 10 维的特征空间,并且想要构建一个直方图,每个维度量化为 20 个值。如何计算联合直方图和边缘直方图的 bin 总数?

【问题讨论】:

  • 10 个维度,每个维度有 20 个 bin,为您提供 20^10 个 bin,如果每个 bin 是一个字节,则超过 9 TB 的数据。我不认为你想这样做......
  • 无论如何,您是在请人为您写一本教科书。这个问题对于 Stack Overflow 来说太宽泛了。您可以在教科书和维基百科页面以及其他资源中找到这些定义。如果您对如何实现这些东西有具体问题,请随时在此处提问。

标签: image-processing computer-vision


【解决方案1】:

我假设您知道一般的直方图是什么。 N维特征空间中数据的联合直方图是N维的。您只需将数据点放入 N 维箱(通常是 N 维网格的笛卡尔积)。边际直方图小于 N 维直方图,其中一个或多个维度已被忽略。联合直方图和边缘直方图与joint/marginal distributions 非常相似。

如何计算它们取决于您的具体情况。您可以通过在某些维度上积分来从联合直方图计算边际直方图,或者您可以以与联合直方图相同的方式构建它们,但维度更少。例如,在 Matlab 中,histcounts2 计算二维数据的联合直方图。对于更高维度的数据,accumarray 可能会有所帮助。在带有 NumPy 的 Python 中,histogramdd 生成多维直方图。通常,N 维 bin 是每个维度中 bin 的笛卡尔积,生成的直方图是简单的 Numpy 数组(在 Python 中)或矩阵(在 Matlab 中)。

N=2D 中的简单示例(在 Matlab 中)

让我们先创建一些数据

x = 3*randn(1e4, 1);
y = randn(1e4, 1);
scatter(x, y, '.');
xlim([-10,10]);
ylim([-10,10]);
pbaspect([1,1,1]);

让我们计算联合直方图

h = histcounts2(x, y, -10:10, -10:10);

让我们显示联合直方图并在每一侧显示边缘直方图,这可以通过在一维上整合联合直方图或通过分别为数据轴创建一维直方图来获得。这里边际直方图是通过计算一维直方图(忽略其他数据维度)创建的。

fig = figure;
subplot('Position', [0.35, 0.35, 0.6, 0.6]);
im = imagesc(-10:10, -10:10, h.');
im.Parent.YDir = 'normal';
axis image;
title('joint histogram (x,y)');

subplot('Position', [0.43, 0.1, 0.45, 0.15]);
histogram(x, -10:10);
camroll(180);
title('marginal histogram x');

subplot('Position', [0.2, 0.4, 0.15, 0.55]);
histogram(y, -10:10);
camroll(90);
title('marginal histogram y');

可以清楚地看到,边缘直方图只是对应于沿一个方向的联合直方图的加法。

【讨论】:

  • 虽然这个比较老,但是这个解释很好。非常感谢。
  • @MD98 一年并不老。 :)
猜你喜欢
  • 2012-07-15
  • 2016-05-23
  • 2013-11-01
  • 2015-11-24
  • 2014-06-29
  • 2019-10-23
相关资源
最近更新 更多