功能描述:
%利用大津法(Ostu)計算閾值
%{
大津法由大津于1979年提出,對圖像Image,記t為前景與背景的分割閾值,前景點數占圖像
比例為w0,平均灰度為u0;背景點數占圖像比例為w1,平均灰度為u1。
圖像的總平均灰度為:u=w0*u0+w1*u1。從最小灰度值到最大灰度值遍歷t,
當t使得值g=w0*(u0-u)2+w1*(u1-u)2 最大時t即為分割的最佳閾值。
對大津法可作如下理解:該式實際上就是類間方差值,閾值t分割出的前景和背景兩部分構成
了整幅圖像,而前景取值u0,概率為 w0,背景取值u1,概率為w1,總均值為u,根據方差的
定義即得該式。因方差是灰度分布均勻性的一種度量,方差值越大,說明構成圖像的兩部分差
別越大, 當部分目標錯分為背景或部分背景錯分為目標都會導致兩部分差別變小,因此使類
間方差最大的分割意味著錯分概率最小。
%}
%Matlab實現大津法計算閥值
function threshold = otsu(grayImage)
%取出最大灰度值,max只能找到每一列的最大值
maxGrayValue = max(max(grayImage));
%取出最小灰度值
minGrayValue = min(min(grayImage));
%求初始閥值
t = double(minGrayValue:maxGrayValue);
%圖像大小
gsize = size(grayImage);
%圖像像素總個數
muxsize = gsize(1)*gsize(2);
for k = 1:length(t)
%從最小灰度值到最大值的計算方法
tk = t(1,k);
%定義前景和背景像素數
iforeground = 0;
ibackground = 0;
%定義前景和背景的灰度總和
foreground = 0;
background = 0;
for i = 1:gsize(1)
for j = 1:gsize(2)
tmp = grayImage(i,j);
if(tmp >= tk)
%前景灰度值
iforeground = iforeground + 1;
foreground = foreground + double(tmp);
else
%背景灰度值
ibackground = ibackground + 1;
background = background + double(tmp);
end
end
end
w0 = iforeground / muxsize;
w1 = ibackground / muxsize;
u0 = foreground / iforeground;
u1 = background / ibackground;
t(2,k) = w0*w1*(u0-u1)*(u0-u1);
end
%遍歷后尋找grayIamge的第二行的最大值
%第二行方差的最大值,忽略NaN
omax = max(t(2,:));
%方差最大值所對應的列號,find只能檢查一行中的數,或一維數組
index = find(t(2,:) >= omax);
%從第一行取出灰度值作為閥值
t = t(1,index);
threshold = t;
聯系:highspeedlogic
QQ :1224848052
微信:HuangL1121
郵箱:1224848052@qq.com
網站:http://www.mat7lab.com/
網站:http://www.hslogic.com/
微信掃一掃:
|