最大熵阈值分割法
(1)什么是熵?
熵是用來衡量一個分布的均勻程度,熵越大,說明分布越均勻。
在信息論中,信息熵可以說明消息的混沌程度,熵越大說明消息越不明了,難以從消息中得到有效信息。舉一個超級簡單的例子,假設一輛車開到了一個T字型的路口,限定它必須要么左轉,要么右轉,設左轉的概率是P1,右轉的概率是P2,除此之外沒有任何信息了,問如何估計P1和P2?你現(xiàn)在有的信息僅僅是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的底數(shù)取多少并沒有規(guī)定
(3)最大熵閾值分割原理
利用圖像熵為準則進行圖像分割是由Kapuret提出來,是現(xiàn)在仍然使用較廣的一種圖像熵分割方法。原論文《A New Method forGray-Level Picture ThresholdingUsing the Entropy of the Histogram》,在百度學術上可以免費下載。
給定一個特定的閾值 q(0<=q<K-1),對于該閾值所分割的兩個圖像區(qū)域C0,C1,其估算的概率密度函數(shù)可表示為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
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個分割閾值,分別計算各閾值下的概率密度函數(shù) c0 = zeros(256,256); c1 = zeros(256,256); for i = 1:256for j = 1:iif sumP(i) > 0c0(i,j) = p(j)/sumP(i); %計算各個閾值下的前景概率密度函數(shù)elsec0(i,j) = 0;endfor k = i+1:256if sumQ(i) > 0;c1(i,k) = p(k)/sumQ(i); %計算各個閾值下的背景概率密度函數(shù)elsec1(i,k) = 0;endendend end%計算各個閾值下的前景和背景像素的累計熵 H0 = zeros(256,256); H1 = zeros(256,256); for i = 1:256for j = 1:iif c0(i,j) ~=0H0(i,j) = - c0(i,j).*log10(c0(i,j)); %計算各個閾值下的前景熵endfor k = i+1:256if c1(i,k) ~=0H1(i,k) = -c1(i,k).*log10(c1(i,k)); %計算各個閾值下的背景熵endendend 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)]);?
總結
- 上一篇: 在线演示(动画演示)各种算法的实现过程
- 下一篇: 未来能源互联网技术革命,能源产业大数据应