最大熵阈值分割法

(1)什么是熵?

熵是用来衡量一个分布的均匀程度,熵越大,说明分布越均匀

在信息论中,信息熵可以说明消息的混沌程度,熵越大说明消息越不明了,难以从消息中得到有效信息。举一个超级简单的例子,假设一辆车开到了一个T字型的路口,限定它必须要么左转,要么右转,设左转的概率是P1,右转的概率是P2,除此之外没有任何信息了,问如何估计P1和P2?你现在有的信息仅仅是P1+P2=1而已,按最大熵的思想,既然你没有其他任何信息来说明向左转的可能性比向右转的可能性大(或小),那就应该把它们两一视同仁,同等对待,不能偏袒其一,于是应该 P1=P2=1/2,这就是最大熵的思想。仔细想想还是挺有道理的,假设你觉得这样不是最合适的解,你给出了另一个解P1=3/4,P2=1/4那就要问了,凭什么往左转的概率比往右转的大呢?已经没有任何信息再支持你的判断了呀。因此,只能把它们两同等对待了。事实上,P1=P2=1/2这个分布的熵比这个P1=3/4,P2=1/4分布的熵要大,因为前者比后者均匀,越均匀熵越大,就越是同等对待(均匀的意思就是大家都一样)。

(2)熵的定义

                                                                           

这里log的底数取多少并没有规定

(3)最大熵阈值分割原理

利用图像熵为准则进行图像分割是由Kapuret提出来,是现在仍然使用较广的一种图像熵分割方法。原论文《A New Method forGray-Level Picture ThresholdingUsing the Entropy of the Histogram》,在百度学术上可以免费下载。

给定一个特定的阈值 q(0<=q<K-1),对于该阈值所分割的两个图像区域C0,C1,其估算的概率密度函数可表示为:

                                          

                                                        

P0(q),P1(q)分别表示的是q阈值分割的背景和前景像素的累计概率,两者之和为1。背景和前景对应的熵表示如下:

                                                           

在该阈值下,图像总熵为:

                                                              

计算所有分割阈值下的图像总熵,找到最大的熵,将最大熵对应的分割阈值作为最终的阈值,图像中灰度大于此阈值的像素作为前景,否则作为背景。

分割阈值的选取是困难的,我们在算法中选取了256个分割阈值,也就是256级灰度,从第1级灰度一直计算到第256级灰度,因此有256个图像总熵,找到最大的总熵及其位置,例如是第50个,那么最终的分割阈值就是灰度=50。

MATLAB代码如下:

clear
Imag = imread('rice.png');
[X, Y] = size(Imag);
figure ();
imhist(Imag); 
% 计算图像直方图
hist = imhist(Imag);
p = hist/(X*Y); % 各灰度概率
 
sumP = cumsum(p);
sumQ = 1-sumP;
 
%将256个灰度作为256个分割阈值,分别计算各阈值下的概率密度函数
c0 = zeros(256,256);
c1 = zeros(256,256);
for i = 1:256
    for j = 1:i
        if sumP(i) > 0
            c0(i,j) = p(j)/sumP(i); %计算各个阈值下的前景概率密度函数
        else
            c0(i,j) = 0;
        end
        for k = i+1:256
            if sumQ(i) > 0;
                c1(i,k) = p(k)/sumQ(i); %计算各个阈值下的背景概率密度函数
            else
                c1(i,k) = 0;
            end
        end
    end 
end
 
%计算各个阈值下的前景和背景像素的累计熵
H0 = zeros(256,256);
H1 = zeros(256,256);
for i = 1:256
   for j = 1:i
       if c0(i,j) ~=0
           H0(i,j) =  - c0(i,j).*log10(c0(i,j));  %计算各个阈值下的前景熵
       end
       for k = i+1:256
          if c1(i,k) ~=0
              H1(i,k) =  -c1(i,k).*log10(c1(i,k));  %计算各个阈值下的背景熵
          end
       end
   end  
end
HH0 = sum(H0,2);
HH1 = sum(H1,2);
H = HH0 + HH1; 
[value, Threshold] = max(H);
 
BW = im2bw(Imag, Threshold/255);
figure ();
imshow(BW);
xlabel(['最大熵', num2str(Threshold)]);

 

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页