function [inter,k,local_min,local_max]=num_interval(f);
%f=double(f);
[hist,x]=imhist(f,256);
index1=0;
index2=0;
loc=1;
status=-1;%status=1 is local_max status=0 is local_min
%status=-1 is the first hist
for i=1:255
if hist(i)>hist(i+1)
if status==-1
index1=index1+1;
local_max(index1)=1;
status=1;
elseif status==0 %前一个状态是局部极小时
index1=index1+1;
local_max(index1)=i;
status=1;
end
elseif hist(i)<hist(i+1)
if status==-1
index2=index2+1;
local_min(index2)=1;
status=0;
elseif status==1 %前一个状态是局部极大时
index2=index2+1;
local_min(index2)=i;
status=0;
end
end
end
if index2<index1
index2=index2+1;
local_min(index2)=256;
elseif index2>index1
index1=index1+1;
local_max(index1)=256;
end
lmin=[local_min 256];
maxlevel = double(max(f(:)));
minlevel = double(min(f(:)));
classnum=round((maxlevel-minlevel)/10);
n=size(local_max,2);
maxinter=max(hist)/(2*classnum);
while n>classnum
i=1;
flag=0;
n=size(local_max,2);
while i<n
if hist(local_min(i))<=hist(local_min(i+1)) & hist(local_max(i))<=hist(local_max(i+1))
%N 形邻域
if (hist(local_max(i))-hist(local_min(i+1)))<=(hist(local_max(i+1))-hist(local_max(i))) & ...
(local_max(i+1)-local_max(i))<maxinter
%满足合并条件
%合并
%class(class==class(local_max(i)))=class(local_max(i+1));
local_max=[local_max(1:i-1) local_max(i+1:n)];
local_min=[local_min(1:i) local_min(i+2:n)];
n=size(local_max,2);
flag=1;
else
i=i+1;
end
else
i=i+1;
end
end
i=1;
n=size(local_max,2);
while i<n-1
if hist(local_min(i+1))>=hist(local_min(i+2)) & hist(local_max(i))>=hist(local_max(i+1))
%H 形邻域
if (hist(local_max(i+1))-hist(local_min(i+1)))<=(hist(local_max(i))-hist(local_max(i+1))) & ...
(local_max(i)-local_max(i+1))<maxinter
%满足合并条件
%合并
% class(class==class(local_max(i+1)))=class(local_max(i));
local_max=[local_max(1:i) local_max(i+2:n)];
local_min=[local_min(1:i) local_min(i+2:n)];
n=size(local_max,2);
flag=1;
else
i=i+1;
end
else
i=i+1;
end
end
if flag==0
break;
end
end
diff=local_max(2:size(local_max,2))-local_max(1:size(local_max,2)-1)+local_min(2:size(local_min,2))-local_min(1:size(local_min,2)-1);
n=size(local_max,2);
while n>classnum
loc=find(diff==min(diff));
if hist(local_max(loc(1)))<hist(local_max(loc(1)+1))
local_max=[local_max(1:loc(1)-1) local_max(loc(1)+1:n)];
local_min=[local_min(1:loc(1)) local_min(loc(1)+2:n)];
else
local_max=[local_max(1:loc(1)) local_max(loc(1)+2:n)];
local_min=[local_min(1:loc(1)) local_min(loc(1)+2:n)];
end
n=n-1;
diff=local_max(2:size(local_max,2))-local_max(1:size(local_max,2)-1)+local_min(2:size(local_min,2))-local_min(1:size(local_min,2)-1);
end
k=size(local_min,2);
for i=1:k-1
inter(i,:)=[local_min(i) local_min(i+1)];
end
inter(k,:)=[local_min(k) 256];
- 1
- 2
前往页