什么是图像处理中的联合直方图和边际直方图,它们如何工作以及如何构建联合直方图和边缘直方图,请尽可能使用简单的示例。
例如,如果我有一个10维的特征空间,并且想构建一个直方图,每个维量化为20个值。如何计算联合直方图和边际直方图的总格数?
答案 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]);
让我们计算联合直方图
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');
可以很好地看到,边际直方图仅对应于一个方向上的联合直方图的积。