涉及到的主要知识点:图像的四叉分解、连接(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)
%以上为做一些预处理,获得二值图像
(注:原图像“枫叶”链接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)
>> [x,y]=minperpoly(bwf_filt_fillholes,2);%使用大小为2的方形单元
>> b2=connectpoly(x,y);
>> B2=bound2im(b2,M,N,xmin,ymin);
>> figure,imshow(B2)
>> 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)
可以看到,随着cellsize增大,边界分辨率降低了(但边界的主要特征得到了保留,实际上,当cellsize很大以后,特征会丢失得越多),而且当cellsize=8时,出现了交叉。解决方法一是删除其中的一个顶点,二是增加或者减小方格单元的大小。
后记:
minperpoly函数中涉及到四叉分解与块替换的内容,MPP的求得是基于“橡皮筋拉伸”的原理。具体参Conzalez DIPUM p.330-337