我想从形态骨架中创建一个物体的图像。 MATLAB或C,C ++代码中是否有任何功能?提前谢谢。
原始图像及其骨架(使用bwmorph(image,'skel',Inf)
获得):
答案 0 :(得分:6)
如上面的评论中所述,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')
结果:
答案 1 :(得分:0)
根据您的对象,您可以使用扩张(Matlab中的IMDILATE)获得有意义的结果。
答案 2 :(得分:0)
函数bwmorph
可用于代码生成,如Image Processing functions for code generation所示。将代码写入MATLAB函数并使用codegen
command。用于生成代码。代码生成选项可通过R2012b MATLAB Release Notes获得。