【问题标题】:Is there any function opposite to bwmorph(image,'skel') in MATLAB or C,C++ code?MATLAB 或 C、C++ 代码中是否有与 bwmorph(image,'skel') 相对的函数?
【发布时间】:2011-10-04 12:52:19
【问题描述】:

我想从它的形态骨架创建一个对象的图像。 MATLAB 或 C、C++ 代码中是否有任何函数?提前致谢。

原图及其骨架(使用bwmorph(image,'skel',Inf)获得):

【问题讨论】:

  • 一般来说这是不可能的,除非你有一个形状非常简单的对象。您能否发布您正在谈论的图像示例(骨架化之前和之后)
  • 你好@Amro,对象是一个简单的形状。原图:http骷髅:http
  • 在这里,在“更多信息”下,您可以了解简单的算法reference.wolfram.com/mathematica/ref/…
  • @belisarius:+1 应该作为答案发布
  • @Amro 我将这个定义用于“骨架”reference.wolfram.com/mathematica/ref/SkeletonTransform.html。当然,我可能是错的。无论如何,如果你的骨架只是黑白的,就没有办法知道什么时候停止扩张它。 (一个大圆圈和一个小圆圈,都给你同样的“骨架”)

标签: c++ c matlab image-processing morphological-analysis


【解决方案1】:

如上面的 cmets 所述,bwmorph(..,'skel',Inf) 为您提供了骨架的二值图像,仅靠它不足以恢复原始图像。

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

请注意,InverseDistanceTransform 的这种实现相当慢(我基于previous answer)。它反复使用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')

结果:

【讨论】:

  • 非常感谢您的努力。抱歉回复晚了。问题的解决方法与您的类似。实际上,骨架以 x,y 坐标和半径/重量给出。重建是在每个 x,y 坐标和其权重半径处绘制闭合圆。
  • 即使 9 年过去了,我也发现这很有用。一个有用的提示:随时缓存掩码很有帮助。我使用带有 dist(i,j) 键的 container.Map 来极大地加快我的应用程序的速度。尽管您必须概括掩码位置才能使其工作:)
【解决方案2】:

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

【讨论】:

  • 乔纳斯,感谢您的即时回复。希望,会应付它。 ))
【解决方案3】:

函数bwmorph 可用于代码生成,如Image Processing functions for code generation 所示。在 MATLAB 函数中编写代码并使用 codegen command。用于生成代码。代码生成选项在 R2012b MATLAB Release Notes 之后可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 2017-01-21
    • 2014-06-09
    • 1970-01-01
    • 2014-08-06
    • 2019-01-08
    相关资源
    最近更新 更多