理论
网上有很多博客都写了理论,但是很少有代码 就算有也是opencv c++的代码
所以贴一个自己写的matlab版本
otsu理论的话, 看冈萨雷斯的《数字图像处理》 第10.3.6节 多阈值处理
看完书,按照书上的理论来写的
MATLAB代码
otsu 双阈值函数:
function [t1,t2]=DoubleOtsuThresh(img)
%
% Otsu 双阈值求解
% 输入 图像img,输出 最优阈值t1和t2(归一化,范围在[0,1])
%
%
BinsNum = 256;
hist = imhist(img,BinsNum);
p = hist / sum(hist); % 直方图的概率密度函数
mG= sum(p .* (1:BinsNum)'); % 全局均值
P1 = cumsum(p); % 概率分布
m1 = cumsum(p .* (1:BinsNum)')./P1; % 256*1 每个阈值的前景平均灰度
% 根据算法理论,从k2+1累加到L-1,可以先倒着累加再翻转回来
P3= cumsum(flip(p));
m3 = cumsum(flip(p) .* flip(1:BinsNum)')./P3;
P3=flip(P3);
P3=[P3(2:end) ;0]; %P3的索引用k2,则P3(1)实际上是从p(2)加到p(256),所以要移动一个
%移动后也用不到P3<