Ostu最大類間差方法
Ostu方法又名最大類間差方法,通過統計整個影象的直方圖特性來實現全域性閾值T的自動選取,其演算法步驟為:
1) 先計算影象的直方圖,即將影象所有的畫素點按照0~255共256個bin,統計落在每個bin的畫素點數量
2) 歸一化直方圖,也即將每個bin中畫素點數量除以總的畫素點
3) i表示分類的閾值,也即一個灰度級,從0開始迭代
4) 通過歸一化的直方圖,統計0~i 灰度級的畫素(假設畫素值在此範圍的畫素叫做前景畫素) 所佔整幅影象的比例w0,並統計前景畫素的平均灰度u0;統計i~255灰度級的畫素(假設畫素值在此範圍的畫素叫做背景畫素) 所佔整幅影象的比例w1,並統計背景畫素的平均灰度u1
5) 計算前景畫素和背景畫素的方差 g = w0*w1*(u0-u1) (u0-u1)
6) i++;轉到4),直到i為256時結束迭代
7)將最大g相應的i值作為影象的全域性閾值
clear all;close all;clc
img=imread('C:\Users\hjd\Desktop\test1.jpg');
if ndims(img)==3
img = rgb2gray(img);
end
[count, x] = imhist(img);
ostu_result = [];
sum_pixel = sum(count(:));
count_w = count(:)/sum_pixel;
count_u = count(:).*x(:);
for i=1:256
w0 = sum(count_w(1:i));
sum_u0 = sum(count_u(1:i));
u0 = sum_u0/sum(count(1:i));
if i==256
w1=0;
u1=0;
else
w1 = sum(count_w(i+1:end));
sum_u1 = sum(count_u(i+1:end));
u1 = sum_u1/sum(count(i+1:end));
end
ostu_result(i) = w0*w1*(u0-u1)^2;
end
[index,maxValue]=max(ostu_result);
level = graythresh(img);