从深度提取轮廓

silhouette extraction from depth

你好,我有一张深度图像,我想从中提取人(人)的剪影。我像这样使用像素阈值:

for i=1:240 
  for j=1:320 
    if b(i,j)>2400 || b(i,j)<1900 
      c(i,j)=5000; 
    else 
      c(i,j)=b(i,j); 
    end 
  end
end

但还剩一部分。有什么办法可以消除它吗?

Original_image:

Extracted_silhouette:

这很难通过阈值来做到,因为沙发与人的上半身处于相同的深度。 你需要分割出整个人,还是分割出上半身就足够了?后一种情况,你可以尝试使用vision.CascadeObjectDetector是Computer Vision System Toolbox来检测RGB图像中人的上半身。

根据this thread可以根据估计的表面法线方向找到深度图边界。
要估计表面法线的方向,您可以

[dzx dzy] = gradient( depth_map ); %// horizontal and vertical derivatives of depth map
n = cat( 3, dzx, dzy, ones(size(dzx)) );
n = bsxfun( @rdivide, n, sqrt( sum( n.^2, 3 ) ) ); %// normalize to unit length

一个简单的方法是阈值

e = abs( n(:,:,3) ) < 1e-2;

结果为

可以在 this answer 中找到一种更复杂的从边界导出轮廓的方法。

基于 的工作,您可以获取阈值输出,然后将边界应用于该图像。下面是一个示例,您可以从前面步骤的输出中输入 [YOUR_IMAGE],然后修改 [ADJUST] 的值,直到只有人 selected。

此代码正在根据大小寻找边界,不会 select 任何大于您输入的值的东西。很简单,但对我有用。希望这有帮助。

boundaries = bwboundaries([YOUR_IMAGE]);    
 numberOfBoundaries = size(boundaries)
   if (size(boundaries) < [ADJUST])
      for k = 1 : numberOfBoundaries
         thisBoundary = boundaries2{k}
         plot(thisBoundary(:,2), thisBoundary(:,1), 'b', 'LineWidth', 2);   
      end
   end