I = imread('cameraman.tif');
Run Code Online (Sandbox Code Playgroud)
步骤1.计算每个强度级别的直方图和概率.
nbins = 256; % Number of bins
counts = imhist(I,nbins); % Each intensity increments the histogram from 0 to 255
p = counts / sum(counts); % Probabilities
Run Code Online (Sandbox Code Playgroud)
步骤2.设置初始omega_i(0)和mu_i(0)
omega1 = 0;
omega2 = 1;
mu1 = 0;
mu2 = mean(I(:));
Run Code Online (Sandbox Code Playgroud)
步骤3.逐步执行从0到最大强度(255)的所有可能阈值
步骤3.1更新omega_i和mu_i
步骤3.2计算sigma_b_squared
for t = 1:nbins
omega1(t) = sum(p(1:t));
omega2(t) = sum(p(t+1:end));
mu1(t) = sum(p(1:t).*(1:t)');
mu2(t) = sum(p(t+1:end).*(t+1:nbins)');
end
sigma_b_squared_wiki = omega1 .* omega2 .* (mu2-mu1).^2; % Eq. (14)
sigma_b_squared_otsu = (mu1(end) .* omega1-mu1) .^2 ./(omega1 .* (1-omega1)); % Eq. (18)
Run Code Online (Sandbox Code Playgroud)
步骤4期望阈值对应于sigma_b_squared的最大位置
[~,thres_level_wiki] = max(sigma_b_squared_wiki);
[~,thres_level_otsu] = max(sigma_b_squared_otsu);
Run Code Online (Sandbox Code Playgroud)
wiki-version eq之间存在一些差异.(14)在大津和eq.(18),我不知道为什么.但是thres_level_otsu
对应于MATLAB的实现graythresh(I)