利用阀值法对图像进行分割: >> f=imread('peppers.png'); >> f=rgb2gray(f); >> f=im2double(f);
>> t=0.5*(min(f(:))+max(f(:))); >> done=false; >> while ~done g=f>=t;
tn=0.5*(mean(f(g))+mean(f(~g))); done=abs(t-tn)<0.1; t=tn; end;
>> display('Threshold(t)-Iterative'); Threshold(t)-Iterative >> t t =
0.4691
>> r=im2bw(f,t);
>> subplot(2,2,1);imshow(f); >> subplot(2,2,2);imshow(r);
>> xlabel('迭代法全局阀值分割'); >> th=graythresh(f); >> th th =
0.3961
>> s=im2bw(f,th);
>> subplot(2,2,3);imshow(s); >> xlabel('全局阀值Otsu分割'); >> se=strel('disk',10); >> ft=imtophat(f,se); >> thr=graythresh(ft); >> thr thr =
0.1098
>> lt=im2bw(ft,thr);
>> subplot(2,2,4);imshow(lt); >> xlabel('局部阀值分割');
用迭代法对图像进行分割: >> i=imread('eight.tif'); >> zmax=max(max(i)); >> zmin=min(min(i)); >> tk=(zmax+zmin)/2; >> bcal=1;
>> isize=size(i); >> while (bcal) ifg=0; ibg=0; fg=0; bg=0;
for j=1:isize(1) for k=1:isize(2) tmp=i(j,k); if(tmp>=tk) ifg=ifg+1;
fg=fg+double(tmp); else
ibg=ibg+1;
bg=bg+double(tmp); end;
end; end;
zo=fg/ifg; zb=bg/ibg;
tktmp=uint8((zo+zb)/2); if(tktmp==tk) bcal=0; else
tk=tktmp; end; end;
>> disp(strcat('迭代后阀值',num2str(tk))); 迭代后阀值165
>> newi=im2bw(i,double(tk)/255); >> subplot(1,2,1);imshow(i); >> subplot(1,2,2);imshow(newi); >> xlabel('迭代法');
用Otsu法进行阀值选择: >> i=imread('coins.png'); >> subplot(1,2,1);imshow(i);
>> bw=im2bw(i,graythresh(getimage)); >> subplot(1,2,2);imshow(bw);
使用分水岭算法对图像进行分割:
>> c1=-10; >> c2=-c1;
>> dist=sqrt(2*(2*c1)^2); >> rad=dist/2*1.4;
>> li=[floor(c1-1.2*rad) ceil(c2+1.2*rad)]; >> [x,y]=meshgrid(li(1):li(2));
>> bw1=sqrt((x-c1).^2+(y-c1).^2)<=rad; >> bw2=sqrt((x-c2).^2+(y-c2).^2)<=rad; >> bw=bw1|bw2;
>> subplot(1,3,1);imshow(bw); >> d=bwdist(~bw);
>> subplot(1,3,2);imshow(d,[]); >> d=-d;
>> d(~bw)=-Inf; >> l=watershed(d);
>> rgb=label2rgb(l,'jet',[.5 .5 .5]); >> subplot(1,3,3);imshow(rgb);
使用分水岭算法: >> c1=-10; >> c2=-c1;
>> dist=sqrt(3*(2*c1)^2); >> rad=dist/2*1.4;
>> li=[floor(c1-1.2*rad) ceil(c2+1.2*rad)]; >> [x,y,z]=meshgrid(li(1):li(2));
>> bw1=sqrt((x-c1).^2+(y-c1).^2+(z-c1).^2)<=rad; >> bw2=sqrt((x-c2).^2+(y-c2).^2+(z-c2).^2)<=rad; >> bw=bw1|bw2;
>> figure;isosurface(x,y,z,bw,0.5);axis equal; >> set(gcf,'color','w');
>> xlim(li);ylim(li);zlim(li);
>> view(3);camlight;lighting gouraud; >> d=bwdist(~bw);
>> figure;isosurface(x,y,z,d,rad/2);axis equal; >> set(gcf,'color','w');
>> xlim(li);ylim(li);zlim(li);
>> view(3);camlight;lighting gouraud;
>> d=-d;
>> d(~bw)=-Inf; >> l=watershed(d); >> figure;
>> isosurface(x,y,z,l==2,0.5); >> isosurface(x,y,z,l==3,0.5); >> axis equal;
>> set(gcf,'color','w');
>> xlim(li);ylim(li);zlim(li);
>> view(3);camlight;lighting gouraud;