【Matlab】轮廓骨骼提取

介绍一个神函数:bwmorph。人生苦短,我还是选matlab吧。

背景:需要把图像中提取出来的粗轮廓“压缩”成一个像素点的细线,即骨骼提取。本来的轮廓粗细不均匀,用图像腐蚀会导致一些点断掉。(注:轮廓内部需要填充)

 

  • 首先是形态学close操作
%openclose
se = strel('disk', 5, 4);
fo = imclose(img, se);
figure(1)
imshow(fo)

strel定义核的形状和大小,关键字‘disk’指圆形核,后面两个数字指核的大小和圆的半径。这个函数还有其他形状的核,但此处目的为了平滑轮廓,所以选圆形核。

 

  • 轮廓骨骼提取
ginf = bwmorph(fo, 'thin', 100);

关键字‘thin’的作用不太清楚,后面有机会再去研究,数字100指迭代次数,可以用‘Inf’代替,迭代次数不同效果也不同。

 

  • 骨刺去除
for k = 1:15
    ginf = ginf & ~endpoints(ginf);
end
figure(2)
imshow(ginf)

k也表示迭代次数,该操作可以去除上一部提取的骨骼中的小骨刺。

endpoints函数库中好像没有,函数代码如下:

function g = endpoints(f)
persistent lut
if isempty(lut)
    lut = makelut(@endpoint_fcn,3);
end
g=applylut(f,lut);
function is_end_point = endpoint_fcn(nhood)
is_end_point = nhood(2,2) & (sum(nhood(:))==2);

 

一直想在网上找有没有人做过类似的事情,不知道搜索关键字是什么。问了之后才知道这操作原来叫骨骼提取。。没事儿多读书吧。。


版权声明:本文为u014120499原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。