什么是图像处理中的联合直方图和边缘直方图,它们如何工作以及如何构建一个,如果可能的话,用简单的例子。
例如,如果我有10维的特征空间并且想要构建直方图,每个维度量化为20个值。如何计算联合直方图和边缘直方图的总仓数?
我假设您知道一般的直方图。 N维特征空间中的数据的联合直方图是N维的。您只需将数据点放入N维箱(通常是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');
可以很好地看到边缘直方图仅对应于沿着方向的联合直方图的累加。