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

时间:2012-04-02 17:50:58

标签: image-processing matlab

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

enter image description here

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

4 个答案:

答案 0 :(得分:7)

取自Otsu's method on Wikipedia

I = imread('cameraman.tif');

步骤1。计算每个强度等级的直方图和概率。<​​/ p>

nbins = 256; % Number of bins
counts = imhist(I,nbins); % Each intensity increments the histogram from 0 to 255
p = counts / sum(counts); % Probabilities

第2步。设置初始omega_i(0)和mu_i(0)

omega1 = 0;
omega2 = 1;
mu1 = 0;
mu2 = mean(I(:));

第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)

第4步所需阈值对应sigma_b_squared的最大位置

[~,thres_level_wiki] = max(sigma_b_squared_wiki);
[~,thres_level_otsu] = max(sigma_b_squared_otsu);

wiki-version eq之间存在一些差异。 (14)在大津和eq。 (18),我不知道为什么。但是thres_level_otsu对应于MATLAB的实现graythresh(I)

答案 1 :(得分:1)

由于Matlab中的函数graythresh实现了Otsu方法,您需要做的是将图像转换为灰度,然后使用im2bw函数使用{返回的threhsold级别对图像进行二值化。 {1}}。

要将图片graythresh转换为灰度,您可以使用以下代码:

I

要使用Otsu的方法获取二进制图像I = im2uint8(I); if size(I,3) ~= 1 I = rgb2gray(I); end; ,请使用以下代码:

Ib

您应该得到以下结果:

enter image description here

答案 2 :(得分:1)

从您的初始问题开始实施OTSU开始,确定MATLAB的graythresh函数基于该方法 OTSU的方法将阈值视为两个峰之间的谷,这两个峰是前景像素之一,另一个是背景像素

与您的图像有关,这似乎是一个历史手稿,发现这个paper比较了可用于阈值文档图像的所有方法

您还可以从here

下载并阅读sauvola阈值

祝其实施好运=)

答案 3 :(得分:1)

纠正了MATLAB实现(针对2d矩阵)

function [T] = myotsu(I,N);

% create histogram

nbins = N; 

[x,h] = hist(I(:),nbins);

% calculate probabilities

p = x./sum(x);

% initialisation

om1 = 0; 

om2 = 1; 

mu1 = 0; 

mu2 = mode(I(:));


for t = 1:nbins,

    om1(t) = sum(p(1:t));
    om2(t) = sum(p(t+1:nbins));
    mu1(t) = sum(p(1:t).*[1:t]);
    mu2(t) = sum(p(t+1:nbins).*[t+1:nbins]);

end

    sigma = (mu1(nbins).*om1-mu1).^2./(om1.*(1-om1));


idx = find(sigma == max(sigma));

T = h(idx(1));