从深度提取轮廓
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
你好,我有一张深度图像,我想从中提取人(人)的剪影。我像这样使用像素阈值:
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 中找到一种更复杂的从边界导出轮廓的方法。
基于
此代码正在根据大小寻找边界,不会 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