用最小周长多边形(MPP)描述图像边界

标签:
mpp最小周长多边形边界描述图像 |
涉及到的主要知识点:图像的四叉分解、连接(4连接/8连接)、Freeman链码、边界提取,以及被称为'cell walls'的概念(细胞墙/细胞联合体/细胞壁)
①原始图像:
>> f=imread('fengye.jpg');
>> gf=rgb2gray(f);
>> bwf=im2bw(f,graythresh(f));
>>
bwf_fillholes=imfill(bwf,'holes');
>>
bwf_sliced=bwf_fillholes(70:547,125:584);
>>
h=fspecial('average',9);bwf_filt=imfilter(bwf_sliced,h);
>>
bwf_filt_fillholes=imfill(bwf_filt,'holes');figure,imshow(bwf_filt_fillholes)
%以上为做一些预处理,获得二值图像
http://s14/middle/6f57a71549998fef7660d&690
(注:原图像“枫叶”链接hiphotos.baidu.com/������/pic/item/2176973bdddee28c7c1e71ff
②求取4连接边界:
>>
b=boundaries(bwf_filt_fillholes,4,'cw');
>> d=cellfun('length',b);
>> [max_d,k]=max(d)
max_d =
k =
>> v=b{k(1)};
>>
[M,N]=size(bwf_filt_fillholes)
M =
N =
>> xmin=min(v(:,1))
xmin =
>> ymin=min(v(:,2))
ymin =
>>
bim=bound2im(v,M,N,xmin,ymin);figure,imshow(bim)
http://s14/middle/6f57a7154999924c63a5d&690
③求MPP:
>>
[x,y]=minperpoly(bwf_filt_fillholes,2);%使用大小为2的方形单元
>> b2=connectpoly(x,y);
>>
B2=bound2im(b2,M,N,xmin,ymin);
>> figure,imshow(B2)
http://s9/middle/6f57a715499992c8c0788&690
比较一下MPP和4连接:
>> whos b2
>> whos v
>> %v是四连接边界,b2是MPP,可以看到MPP比v少了很多点(短了很多)
④为了比较,使用cellsize为3,4,8各作一下:
>>
[x,y]=minperpoly(bwf_filt_fillholes,3);%只需修改cellsize
b2=connectpoly(x,y);figure,B2=bound2im(b2,M,N,xmin,ymin);imshow(B2)
http://s6/middle/6f57a715499993a3b09a5&690
以下为cellsize=4时:
http://s5/middle/6f57a715499993cb85c44&690
以下为cellsize=8时:
http://s12/middle/6f57a715075c2871a648b&690
可以看到,随着cellsize增大,边界分辨率降低了(但边界的主要特征得到了保留,实际上,当cellsize很大以后,特征会丢失得越多),而且当cellsize=8时,出现了交叉。解决方法一是删除其中的一个顶点,二是增加或者减小方格单元的大小。
后记:
minperpoly函数中涉及到四叉分解与块替换的内容,MPP的求得是基于“橡皮筋拉伸”的原理。具体参Conzalez