使用滑动内核(Matlab)在2D网格上平均3D点云的属性

时间:2018-05-14 10:40:50

标签: matlab 3d point-clouds sliding accumarray

我有一个以3列格式[x,y,z]组织的3D点云,从第4列开始,每个点都有其他属性。请注意,所有点的距离都是随机的。我正在尝试实现一个类似于blockproc的移动过滤器,以便创建一个大小为y的二维矩阵,x沿着z“展平”数据并平均一个卷中点云的给定属性。卷应该是沿x和y的固定大小的内核,让我们称之为dx和dy,其中将采用任何z的值。此外,音量应该能够滑动,所以例如移动步骤(让我们称之为xStep和yStep)不一定等于dx和dy(尽管dx = dy和xStep = yStep)。

到目前为止,我找到的Matlab函数是:

blockproc :能够实现滑动内核但是可以在矩阵上运行

accumarray :适用于离散点,但没有滑动内核

3D points and moving block 这是我想要在概念上做的动画片。该函数应捕获红点并应用函数(例如,mean,stdev)来计算红细胞的值。然后通过xStep移动并重新应用该函数。

我知道如何实现这一目标吗?我已经坚持了一段时间。我编写了一个函数,在每次迭代时对点进行索引,但我的数据集相当大(> 10 ^ 7点),因此这种方法非常耗时。 This thread使用accumarray提供MWE,没有滑动内核:

table = [ 20*rand(1000,1) 30*rand(1000,1) 40*rand(1000,1)]; % random data
x_partition = 0:2:20; % partition of x axis
y_partition = 0:5:30; % partition of y axis
L = size(table,1);
M = length(x_partition);
N = length(y_partition);
[~, ii] = max(repmat(table(:,1),1,M) <= repmat(x_partition,L,1),[],2);
[~, jj] = max(repmat(table(:,2),1,N) <= repmat(y_partition,L,1),[],2);
% Calculate the sum
result_sum = accumarray([ii jj], table(:,3), [M N], @sum, NaN);

任何意见都将不胜感激,谢谢! PS:首先发布此帖,抱歉,如果格式错误

0 个答案:

没有答案