本人比较懒直接贴图了,详见冈萨雷斯《数字图像处理》第四版P538-541
function [K,Eta_K] = my_Otsu(fxy)
%函数说明:Otsu最优全局阈值算法
%输入参数:图像fxy
%输出参数:Otsu阈值K,最大可分离性测度Eta_K
pi_1 = zeros(1,256);
MN = size(fxy,1)*size(fxy,2);
ni = zeros(1,256);
%计算各灰度级像素数和概率密度
for i = 1:256
ni(i) = length(find(fxy==(i-1)));
end
for i = 1:256
pi_1(i) = ni(i)/MN;
end
P1 = zeros(1,256);
m1 = zeros(1,256);
%计算概率密度累计和和累计均值P1,m1
for k = 1:256
P1(k) = sum(pi_1(1:k));
m1(k) = sum([0:k-1].*pi_1(1:k));
end
%全局灰度均值mg
mg = sum([0:255].*pi_1);
%计算类间方差
sigmaB_2 = ((mg*P1-m1).^2)./(P1.*(1-P1));
%得到Otsu阈值K
K = find(sigmaB_2==max(sigmaB_2))-1;
%若灰度级不唯一,则求平均
if length(K) ~= 1
K = mean(K);
K = fix(K);
end
sigmaG_2 = sum(([0:255]-mg).^2.*pi_1);
%计算最大可分离性测度
Eta_K = sigmaB_2(K+1)/sigmaG_2;
end
原图像:
阈值处理后图像:
类间方差:
最大可分离性测度: