在Matlab中平移和平均巨大的pointcloud

时间:2013-01-19 13:43:09

标签: matlab 3d binning

我有一个巨大的3D点云,[3x40e6]。它是一个平面的点云,因此在这个意义上它更像是2.5D。我想将pointcloud分成一个固定的网格范围,这样我就可以把它放到一个2D矩阵中并用imagesc(mymap)查看它。

我确实解决了这个问题,但这需要太长时间。这是我到目前为止所得到的。它工作正常,但需要10分钟。它插入了所有类型的jive,我不需要它。

xlin=linspace(min(xx),max(xx),meshsz*dxxyy);
ylin=linspace(min(yy),max(yy),meshsz);
[X,Y]=meshgrid(xlin,ylin);
disp('+ Flattening (X,Y,Z) information into 2D (X,Y)(Z) mesh..')
%Fit to 2D grid (takes a long time)
Z=griddata(xx,yy,zz,X,Y);%,'cubic');

我真正想做的是将我的[3xN]矢量中的所有数据存入我特定的2D范围地图。我想我必须将所有值都加入到该映射中(有一些优秀且快速的分箱算法)但我还需要特定的Z坐标标量,因为这是我想要在每个bin中平均的。

谢谢!

2 个答案:

答案 0 :(得分:2)

以下是您可以一步完成的方法。 accumarray允许您轻松交换用于组合数据的功能,以便您可以使用例如std可以查看本地变化,或numel查看每个bin中的计数。

%# transform your x,y coordinates to pixel (=bin) values
minX = min(xx);
maxX = max(xx);
minY = min(yy);
maxY = max(yy);

targetSize = [512 512];

xxBin = round( (xx-minX)/(maxX-minX)*(targetSize(1)-1) ) +1;
yyBin = round( (yy-minY)/(maxY-minY)*(targetSize(2)-1) ) +1;

%# map by using accumarray, take the mean of each bin 
map = accumarray([xxBin(:),yyBin(:)],zz,targetSize,@mean,0);

答案 1 :(得分:0)

解决。每百万点需要200毫秒。

yidx=[min(yy):dy:max(yy)];
xidx=[min(xx):dx:max(xx)];
ZmapSum=zeros(length(yidx),length(xidx));
ZmapIdx=zeros(size(ZmapSum));

[nx,binx] = histc(xx,xidx);
[ny,biny] = histc(yy,yidx);
%bin==0 means the value is out of range
binx=binx+1; biny=biny+1;
%binzero=( (binx==0) | (biny==0) );
%binx(binzero) = [];
%biny(binzero) = [];
%xx(binzero) = [];
%yy(binzero) = [];
%zz(binzero) = [];

%binx and biny give their respective bin locations
for i=1:1:length(xx)
    ZmapSum(biny(i),binx(i))=ZmapSum(biny(i),binx(i))+zz(i);
    ZmapIdx(biny(i),binx(i))=ZmapIdx(biny(i),binx(i))+1;
end

Zmap=ZmapSum./ZmapIdx;