影象閾值分割:最大熵法
阿新 • • 發佈:2019-02-06
影象最大熵閾值分割的原理:使選擇的閾值分割影象目標區域、背景區域兩部分灰度統計的資訊量為最大。
具體描述:
1. 根據資訊熵定義,計算原始影象的資訊熵H0,選擇最大、最小灰度灰度的均值為初始閾值T0;
2. 根據T0將影象分割為G1和G2兩個區域,均值分別為M1和M2,更新閾值為T2=0.5*(M1+M2);
3. 計算G1和G2的資訊熵Hd和Hb,比較Hd+Hb與H0的大小,如果相等或在規定的範圍內,或者達到最大迭代次數,則將T2最為最終閾值輸出,否則T0=T2,H0=Hd+Hb,重複第2步直到滿足條件。
function ThreshValue = My_MaxEntropy(Imag) % 最大熵計算閾值 % 輸入: % Imag:二維陣列,數值表示灰度; % 輸出: % ThreshValue:閾值 [X, Y] = size(Imag); V_max = max(max(Imag)); V_min = min(min(Imag)); T0 = (V_max + V_min) / 2; % 初始分割閾值 h = My_imhist(Imag); % 計算影象的直方圖 grayp = h/(X*Y); % 求影象畫素概率 % 計算初始熵 H0 = 0; for i = 1 : 256 if grayp(i) > 0 H0 = H0 - grayp(i)*log(grayp(i)); end end % 開始迭代計算 cout = 100; % 設定最大迭代次數 while cout > 0 Tmax = 0; % 初始化 T1 = T0; A1 = 0; % 分割區域G1的點數 A2 = 0; % 分割區域G2的點數 B1 = 0; % 分割區域G1的灰度總和 B2 = 0; % 分割區域G2灰度總和 for i = 1 : X % 計算灰度平均值 for j = 1 : Y if(Imag(i, j) <= T1) A1 = A1 + 1; B1 = B1 + Imag(i, j); else A2 = A2 + 1; B2 = B2 + Imag(i, j); end end end M1 = B1 / A1; % 分割區域G1的平均灰度 M2 = B2 / A2; % 分割區域G2的平均灰度 T2 = (M1 + M2) / 2; % 更新閾值 TT = floor(T2); grayPd = sum(grayp(1 : TT)); % 計算分割區域G1的概率和 if grayPd == 0 grayPd = eps; end grayPb = 1 - grayPd; if grayPb == 0 grayPb = eps; end % 計算分割後區域G1和G2的資訊熵 Hd = 0; Hb = 0; for i = 1 : 256 if i <= TT if grayp(i) > 0 Hd = Hd - grayp(i)/grayPd*log(grayp(i)/grayPd); end else if grayp(i) > 0 Hb = Hb - grayp(i)/grayPb*log(grayp(i)/grayPb); end end end H1 = Hd + Hb; % 總的熵 % 退出條件 if abs(H0 - H1) < 0.0001 Tmax = T2; break; else T0 = T2; H0 = H1; end cout = cout - 1; end % 返回閾值 ThreshValue = floor(Tmax); end % 灰度直方圖 function h = My_imhist(Imag) h = zeros(256, 1); for k = 1 : 256 h(k) = 0; for i = 1 : size(Imag, 2) for j = 1 : size(Imag, 2) if Imag(i, j) == k - 1 h(k) = h(k) + 1; end end end end end