if size(S,3)==1
padvec=[1 1];
else
padvec=[1 1 1];
end
for i=min(min(min(S))):max(max(max(S)))
BW=S==i; %生成二值图。
[L1,num1]=bwlabeln(BW,26); %找连通区域。
%以下用于处理周期边值下边界连通区域的合并。
L2=padarray(L1,padvec,0);
L3=padarray(L1,padvec,'circular'); %周期延拓一个像素。
BW1=padarray(BW,padvec,'circular');
L4=bwlabeln(BW1,26);
BW2=padarray(BW,padvec,0);
ind1=find(BW1-BW2==1); % 找到可能需要合并的连通区域的位置。
for j=1:length(ind1)
a=ind1(j);
ind2=find(L4==L4(a));
if length(ind2)~=1
b=unique(L3(ind2));
for k=1:length(b)
c=b(k);
L2(L2==c)=b(1);
end
end
end
num=0;
for j=1:max(max(max(L2)));
area=length(find(L2==j));
if area~=0
num=num+1;
L_num(num)=area; %计算个数。
end
end
%输出显示
fprintf(['值为 ' num2str(i) ' 的连通区域共有%d个,分布个数为\n'],num);
for k=1:num
fprintf(['连通分量' num2str(k) ': %d个\n'],L_num(k));
end
fprintf('\n');
end