mark
mark

Reputation:

Implementing Otsu binarization for faded images of documents

I'm trying to implement Otsu binarization technique on document images such as the one shown:

enter image description here

Could someone please tell me how to implement the code in MATLAB?

Upvotes: 4

Views: 10085

Answers (4)

MobiSteve
MobiSteve

Reputation: 11

Corrected MATLAB Implementation (for 2d matrix)

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

Upvotes: 1

vini
vini

Reputation: 4732

Starting out with what your initial question was implementing the OTSU thresolding its true that MATLAB's graythresh function is based on that method The OTSU's method considers the threshold value as the valley between two peaks that is one of the foreground pixels and the other of the background pixels

Pertaining to your image which seems like a historical manuscript found this paper that compares all the methods that could be used for thresholding document images

You can also download and read up sauvola thresholding from here

Good luck with its implementation =)

Upvotes: 1

Alceu Costa
Alceu Costa

Reputation: 9889

Since the function graythresh in Matlab implements the Otsu method, what you have to do is convert your image to grayscale and then use the im2bw function to binarize the image using the threhsold level returned by graythresh.

To convert your image I to grayscale you can use the following code:

I = im2uint8(I);
if size(I,3) ~= 1
    I = rgb2gray(I);
end;

To get the binary image Ib using the Otsu's method, use the following code:

Ib = im2bw(I, graythresh(I));

You should get the following result:

enter image description here

Upvotes: 1

aagaard
aagaard

Reputation: 1666

Taken from Otsu's method on Wikipedia

I = imread('cameraman.tif');

Step 1. Compute histogram and probabilities of each intensity level.

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

Step 2. Set up initial omega_i(0) and mu_i(0)

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

Step 3. Step through all possible thresholds from 0 to maximum intensity (255)

Step 3.1 Update omega_i and mu_i

Step 3.2 Compute 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)

Step 4 Desired threshold corresponds to the location of maximum of sigma_b_squared

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

There are some differences between the wiki-version eq. (14) in Otsu and the eq. (18), and I don't why. But the thres_level_otsu correspond to the MATLAB's implementation graythresh(I)

Upvotes: 7

Related Questions