用最小周长多边形(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)
%以上为做一些预处理,获得二值图像

用最小周长多边形(MPP)描述图像边界_第1张图片
(注:原图像“枫叶”链接hiphotos.baidu.com/������/pic/item/2176973bdddee28c7c1e71ff.jpg)
②求取4连接边界:

>> b=boundaries(bwf_filt_fillholes,4,'cw');
>> d=cellfun('length',b);
>> [max_d,k]=max(d)
max_d =
        3565
k =
     1
>> v=b{k(1)};
>> [M,N]=size(bwf_filt_fillholes)
M =
   478
N =
   460
>> xmin=min(v(:,1))
xmin =
     1
>> ymin=min(v(:,2))
ymin =
    11
>> bim=bound2im(v,M,N,xmin,ymin);figure,imshow(bim)

用最小周长多边形(MPP)描述图像边界_第2张图片

③求MPP:

>> [x,y]=minperpoly(bwf_filt_fillholes,2);%使用大小为2的方形单元
>> b2=connectpoly(x,y);
>> B2=bound2im(b2,M,N,xmin,ymin);
>> figure,imshow(B2)

用最小周长多边形(MPP)描述图像边界_第3张图片
比较一下MPP和4连接:

>> whos b2
  Name         Size            Bytes  Class     Attributes

  b2        2559x2             40944  double             

>> whos v
  Name         Size            Bytes  Class     Attributes

  v         3565x2             57040  double             

>> %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)

用最小周长多边形(MPP)描述图像边界_第4张图片
以下为cellsize=4时:

用最小周长多边形(MPP)描述图像边界_第5张图片

以下为cellsize=8时:

用最小周长多边形(MPP)描述图像边界_第6张图片
可以看到,随着cellsize增大,边界分辨率降低了(但边界的主要特征得到了保留,实际上,当cellsize很大以后,特征会丢失得越多),而且当cellsize=8时,出现了交叉。解决方法一是删除其中的一个顶点,二是增加或者减小方格单元的大小。

 

后记:

minperpoly函数中涉及到四叉分解与块替换的内容,MPP的求得是基于“橡皮筋拉伸”的原理。具体参Conzalez DIPUM  p.330-337

你可能感兴趣的:(用最小周长多边形(MPP)描述图像边界)