什么是图像处理中的联合直方图和边际直方图?

时间:2019-04-26 20:53:23

标签: image-processing computer-vision

什么是图像处理中的联合直方图和边际直方图,它们如何工作以及如何构建联合直方图和边缘直方图,请尽可能使用简单的示例。

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

1 个答案:

答案 0 :(得分:1)

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

如何计算它们取决于您的具体情况。您可以通过对某些维度进行积分,从联合直方图计算边缘直方图,也可以采用与联合直方图相同的方式构建它们,但维度较小。在Matlab中,例如histcounts2计算2D数据的联合直方图。对于高维数据,accumarray可能会有所帮助。在具有NumPy的Python中,histogramdd生成多维直方图。通常,N维箱是每个维度中箱的笛卡尔积,而直方图则是简单的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]);

enter image description here

让我们计算联合直方图

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');

enter image description here

可以很好地看到,边际直方图仅对应于一个方向上的联合直方图的积。