function [out_im,T1]=based_entropy(imagD) %参考论文:《基于信息熵的图像分割阈值迭代改进算法》
[nHeight,nWidth,dim]=size(imagD);
if dim>1
imagD=rgb2gray(imagD);
end
MAX=round(double(max(imagD(:))));
MIN=round(double(min(imagD(:))));
img=double(imagD);
im1=zeros(nHeight,nWidth);
out_im=zeros(nHeight,nWidth);
hist=imhist(imagD);
hist=hist/sum(hist(:));
HT=0;
for i=MIN:MAX %计算出熵HT
if hist(i+1)==0
temp=0;
else
temp=-hist(i+1)*log(hist(i+1));
end
HT=HT+temp;
end
k=0;
d(1:100)=0;
T1=(MAX+MIN)/2; %选定阈值的初始估计值
for n=2:100
graySum1=0;
graySum2=0;
num1=0;
num2=0;
for i=1:nHeight %初始阈值分割图像,求出前后景的平均灰度grayMean1、grayMean2
for j=1:nWidth
if img(i,j)>T1
graySum1=graySum1+img(i,j);
num1=num1+1;
else
graySum2=graySum2+img(i,j);
num2=num2+1;
end
end
end
if num1~=0
grayMean1=graySum1/num1;
else
grayMean1=0;
end
if num2~=0
grayMean2=graySum2/num2;
else
grayMean2=0;
end
tempT=(grayMean1+grayMean2)/2; %求出新阈值tempT=(前景平均灰度+背景平均灰度)/2
T1=tempT;
for i=1:nHeight %用新阈值分割图像
for j=1:nWidth
if(img(i,j)<T1)
im1(i,j)=0;
else
im1(i,j)=255;
end
end
end
im1=im2bw(imagD,tempT/255); %用新阈值分割图像
hist2=imhist(im1);
hist2=hist2/sum(hist2(:)); %计算前后景的信息熵
H1=-hist2(1)*log(hist2(1));
H2=-hist2(2)*log(hist2(2));
d(n)=HT-(H1+H2); %计算总信息熵与其差值,并在while中判断误差是否在允许范围内
k=k+1; %计算迭代次数
e=d(n)-d(n-1);
if(e==0||k>100)
break;
end
end
% T=T1/MAX;
% out_im=im2bw(imagD,T);
for i=1:nHeight
for j=1:nWidth
if(img(i,j)<T1)
out_im(i,j)=0;
else
out_im(i,j)=255;
end
end
end
% figure,subplot(1,2,1),imshow(imagD);
% subplot(1,2,2),imshow(out_im);