基于滑动核的二维网格上三维点云平均特性(Matlab)

基于滑动核的二维网格上三维点云平均特性(Matlab),matlab,3d,point-clouds,sliding,accumarray,Matlab,3d,Point Clouds,Sliding,Accumarray,我有一个3柱格式的三维点云[x,y,z],从第4列开始,每个点都有额外的属性。请注意,所有点的距离都是随机的。我正在尝试实现一个类似于blockproc的移动过滤器,以创建一个大小为y,x的2D矩阵,该矩阵沿z“展平”数据,并对体积中点云的给定属性求平均值。这个卷应该是一个沿着x和y的固定大小的内核,让我们称它们为dx和dy,在其中取任意z的值。此外,卷应该能够滑动,因此例如,移动步骤(称为xStep和yStep)不一定等于dx和dy(尽管dx=dy和xStep=yStep) 到目前为止,我发现

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

到目前为止,我发现的Matlab函数有:

blockproc:能够实现滑动内核,但可以在矩阵上工作

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

这是一幅我试图在概念上做的卡通画。该函数应捕获红点,并应用函数(如mean、stdev)计算红细胞值。然后按xStep移动并重新应用该函数

你知道我怎样才能做到吗?我已经在这上面呆了一段时间了。我编写了一个函数,在每次迭代时对点进行索引,但我的数据集相当大(>10^7点),因此这种方法非常耗时。使用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);
table=[20*rand(1000,1)30*rand(1000,1)40*rand(1000,1)];%随机数据
x_分区=0:2:20;%x轴的划分
y_分区=0:5:30;%y轴的划分
L=尺寸(表1);
M=长度(x_分区);
N=长度(y_分区);

[~,ii]=max(repmat(表(:,1),1,M)以满足特定需要,如果您有图像处理工具箱,您可以使用:
imboxfilt3
进行平均,
stdfilt
进行标准偏差,
rangefilt
进行局部范围(max-min),
entropyfilt
用于局部熵。您所做的是忽略
z
列。这是一个2D问题。您可以设置2D空间索引结构,并使用该结构有效地查找任何选定矩形内的所有点。一旦找到点,您可以找到相应的属性并对其进行平均。请参见此处: