MATLAB 或 C、C++ 代码中是否有与 bwmorph(image,'skel') 相反的函数?

问题描述 投票:0回答:3

我想根据物体的形态骨架创建物体的图像。 MATLAB 或 C、C++ 代码中有函数吗?预先感谢。

原始图像及其骨架(使用

bwmorph(image,'skel',Inf)
获得):

hand2 handskel2

c++ c matlab image-processing mathematical-morphology
3个回答
7
投票

如上面的评论所述,

bwmorph(..,'skel',Inf)
为您提供了骨架的二值图像,其本身不足以恢复原始图像。

另一方面,如果对于每个骨骼像素,都有距离变换返回的值,那么您可以成功应用反距离变换(如@belisarius建议):

请注意,InverseDistanceTransform的实现相当慢(我基于之前的答案)。它重复使用POLY2MASK来获取指定圆圈内的像素,因此还有改进的空间..

%# get binary image
BW = ~imread('http://img546.imageshack.us/img546/3154/hand2.png');

%# SkeletonTransform[]
skel = bwmorph(BW,'skel',Inf);
DD = double(bwdist(~BW));
D = zeros(size(DD));
D(skel) = DD(skel);

%# zero-centered unit circle
t = linspace(0,2*pi,50);
ct = cos(t);
st = sin(t);

%# InverseDistanceTransform[] : union of all disks centered around each
%# pixel of the distance transform, taking pixel values as radius
[r c] = size(D);
BW2 = false(r,c);
for j=1:c
    for i=1:r
        if D(i,j)==0, continue; end
        mask = poly2mask(D(i,j).*st + j, D(i,j).*ct + i, r, c);
        BW2(mask) = true;
    end
end

%# plot
figure
subplot(131), imshow(BW), title('original')
subplot(132), imshow(D,[]), title('Skeleton+DistanceTransform')
subplot(133), imshow(BW2), title('InverseDistanceTransform')

结果:

original Skeleton_DistanceTransform InverseDistanceTransform


0
投票

根据您的对象,您也许能够使用膨胀获得有意义的结果(Matlab 中的IMDILATE)。


0
投票

函数

bwmorph
可用于代码生成,如此处所示用于代码生成的图像处理函数。在 MATLAB 函数中编写代码并使用
codegen
命令。用于生成代码。代码生成选项在 R2012b MATLAB 发行说明之后可用。

© www.soinside.com 2019 - 2024. All rights reserved.