我有一个RGB图像,并试图获得一个三维可视化的matlab。目前我正在做:
depth = imread('img_031_depth.png');
depth = double(depth);
img = imread('img_031.png');
surf(depth, img, 'FaceColor', 'texturemap', 'EdgeColor', 'none' )
view(158, 38)这给了我一个图像,比如:

我有两个问题:
( 1)如何保存图像而不像上面那样模糊
2)由于你可以看到一些边缘线成零(例如咖啡杯的顶部),我想移除这些。
我想要制作的是一个三维的点云,因为这些只是2.5D,所以我必须从正确的角度展示它们。
任何帮助都是非常感谢的。
编辑:添加图像(注释深度图像需要标准化以进行可视化)


发布于 2014-03-10 13:42:03
如果您只对点云感兴趣,您可能需要考虑scatter3。您可以选择要绘制的点(丢弃使用depth == 0的点)。
你需要有明确的x-y坐标。
[y x] = ndgrid( 1:size(img,1), 1:size(img,2) );
sel = depth > 0 ; % which points to plot
% "flatten" the matrices for scatter plot
x = x(:);
y = y(:);
img = reshape( img, [], 3 );
depth = depth(:);
scatter3( x(sel), y(sel), depth(sel), 20, img( sel, : ), 'filled' );
view(158, 38)编辑:抽样版本
[y x] = ndgrid( 1:2:size(img,1), 1:2:size(img,2) );
sel = depth( 1:2:end, 1:2:end ) > 0;
x = x(:);
y = y(:);
img = reshape( img( 1:2:end, 1:2:end, : ), [], 3 );
depth = depth( 1:2:end, 1:2:end );
scatter( x(sel), y(sel), depth(sel), 20, img( sel, : ), 'filled' );
view( 158, 38 );或者,您可以直接操作sel掩码。
发布于 2014-03-10 14:35:29
我建议你首先恢复x=zv/f和y=zv/f,得到x,y,z,其中f是你相机的焦距;
然后应用任意旋转,在显示x‘,y’,z‘= Rx,y,z+t之前进行平移;
然后使用col = xf/z+w/2,row = h/2-yf/z将其投影回来,以获得一个简单的图像,您可以快速显示;您可以在最后一个操作中添加一个深度缓冲区,以确保在每个像素上写入深度,并检查只有在新z较小时才会发生重复写入(也就是说,新像素接近查看器)。由于点云的性质,最终的图像仍然会有洞。你可以插入这些洞,但这意味着你必须追踪光线从图像中的每一个像素到你的点云,并找到一个最近的邻居射线,这可能要花费很长时间在Matlab中。
发布于 2014-10-20 19:37:39
我也在做一些三维图像恢复和重建。第一个问题很简单。你的照片是用照相机拍的。所以你需要把位置转换成摄像机坐标系。换句话说,你需要知道相机的内在价值!或者你永远无法用一个图像来恢复它。谷歌'kinect内在价值‘你可以得到焦距等,也可以改变你的看法。尝尝这个!如果不起作用,再问一遍。
https://stackoverflow.com/questions/22301571
复制相似问题