为文档的褪色图像实现Otsu二值化

3 matlab image-processing

我正在尝试在文档图像上实现Otsu二值化技术,如下图所示:

在此输入图像描述

有人可以告诉我如何在MATLAB中实现代码吗?

aag*_*ard 7

取自维基百科上的大津方法

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)