次のようなドキュメント画像に大津二値化手法を実装しようとしています。
MATLAB でコードを実装する方法を教えてください。
ウィキペディア大津の方法より
I = imread('cameraman.tif');
ステップ 1.各強度レベルのヒストグラムと確率を計算します。
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 バージョンの eq にはいくつかの違いがあります。(14) 大津と式。(18) 理由はわかりません。しかし、thres_level_otsu
MATLABの実装に対応していますgraythresh(I)
修正された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));
graythresh
Matlabの関数は Otsu メソッドを実装しているため、画像をグレースケールに変換し、im2bw
関数を使用して、 によって返されるしきい値レベルを使用して画像を 2 値化する必要があります graythresh
。
画像をグレースケールに変換するにI
は、次のコードを使用できます。
I = im2uint8(I);
if size(I,3) ~= 1
I = rgb2gray(I);
end;
Ib
Otsu の方法を使用してバイナリ イメージを取得するには、次のコードを使用します。
Ib = im2bw(I, graythresh(I));
次の結果が得られるはずです。
あなたの最初の質問がOTSUgraythresh
のしきい値を実装していたことから始めて、MATLABの関数がその方法に基づいていることは真実です
歴史的な原稿のように見えるあなたの画像に関連して、文書画像のしきい値処理に使用できるすべての方法を比較するこの論文が見つかりました
ここから sauvola のしきい値をダウンロードして読むこともできます
その実装で頑張ってください =)