この例のドキュメント画像のしきい値処理に最適なアルゴリズムは何ですか?


31

表示されている画像にさまざまな二値化アルゴリズムを実装しようとしています: ここに画像の説明を入力してください

コードは次のとおりです。

clc;
clear;
x=imread('n2.jpg');     %load original image

%画像のサイズを変更して、後で計算作業が簡単になるようにします。

size(x);
x=imresize(x,[500 800]);
figure;
imshow(x);
title('original image');

z=rgb2hsv(x);       %extract the value part of hsv plane
v=z(:,:,3);
v=imadjust(v);

これで、niblackおよび%sauvolaアルゴリズムに必要な平均と標準偏差が見つかりました

m = mean(v(:))
s=std(v(:))
k=-.4;
value=m+ k*s;
temp=v;

niblackしきい値アルゴリズムを実装する%:

for p=1:1:500
    for q=1:1:800
        pixel=temp(p,q);
        if(pixel>value)
            temp(p,q)=1;
        else
            temp(p,q)=0;
        end
    end
end
figure;
imshow(temp);
title('result by niblack');
k=kittlerMet(g);
figure;
imshow(k);
title('result by kittlerMet');

%sauvolaしきい値アルゴリズムの実装:

val2=m*(1+.1*((s/128)-1));
t2=v;
for p=1:1:500
for q=1:1:800
    pixel=t2(p,q);
    if(pixel>value)
        t2(p,q)=1;
    else
        t2(p,q)=0;
    end
end

終わり

figure;
imshow(t2);
title('result by sauvola');

得られた結果は次のとおりです。 ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

結果の画像が暗い部分で劣化しているのを見ることができますが、誰かが私の結果を最適化する方法を提案してもらえますか?


1
色情報を使用して、明るさだけでなく背景を捨てることができますか?
エンドリス

尊敬されるサー/マダム。私は画像処理のプロジェクトを行っています。興味深い二値化の概念です。コーディングをチェックして修正してください。コーディングを行い、プログラムを実行します。しかし、このコーディングでエラーが発生しました。そしてもう一つは、MSP(ライン31)K = kittlerMet(g)にエラーがある; ..コーディング...修正してください...それを解決する方法
ムトゥ

回答:


49

画像の輝度は均一ではないため、しきい値を一定にしないでください。適応しきい値が必要です。これは、画像を前処理して画像全体で輝度をより均一にすることで実装できます(Mathematicaで記述されたコード、Matlabバージョンを自分で実装する必要があります)。

明るさを均一にする簡単な方法は、閉じているフィルターを使用して画像から実際のテキストを削除することです。

white = Closing[src, DiskMatrix[5]]

ここに画像の説明を入力してください

フィルタサイズは、フォントストロークの幅よりも大きく、削除しようとしている汚れのサイズよりも小さく選択する必要があります。

編集: 私はコメントで、クローズ操作が何をするのかを説明するように頼まれました。それは形態学的膨張とそれに続く形態学的侵食です。拡張は、本質的に画像内のすべての位置で構造化要素を移動し、マスクの下で最も明るいピクセルを選択します。

  • 構造化要素より小さい暗い構造物を削除する
  • 構造化要素のサイズにより大きな暗い構造を縮小する
  • 明るい構造の拡大

収縮操作は反対のことを行います(構造化要素内の最も暗いピクセルを選択します)ので、膨張した画像に適用すると:

  • 構造化要素よりも小さいために削除された暗い構造物はまだ消えています
  • 縮小された暗い構造は、元のサイズに再び拡大されます(ただし、形状はより滑らかになります)
  • 明るい構造は元のサイズに縮小されます

したがって、クローズ操作は、小さな暗いオブジェクトを削除し、大きな暗いオブジェクトと明るいオブジェクトへのわずかな変更のみを行います。

次に、さまざまな構造化要素サイズの例を示します。

ここに画像の説明を入力してください

構造化要素のサイズが大きくなると、ますます多くの文字が削除されます。radius = 5では、すべての文字が削除されます。半径をさらに大きくすると、小さな汚れも除去されます。

ここに画像の説明を入力してください

元の画像をこの「白い画像」で除算するだけで、(ほぼ)均一な明るさの画像が得られます。

whiteAdjusted = Image[ImageData[src]/ImageData[white]*0.85]

ここに画像の説明を入力してください

この画像は、一定のしきい値で二値化できるようになりました。

Binarize[whiteAdjusted , 0.6]

ここに画像の説明を入力してください


5
うわー!これは本当にクールです!巨大な+1!
フォノン

@nikie +1非常に素晴らしい-フィルターを閉じることを「フォントストロークよりも大きく選択する」必要があるということはどういう意味ですか?文字の幅または長さ?さらに、「本当に」閉じるフィルターは何をしているのでしょうか?ありがとう!
スペイシー

1
@Mohammad:答えに少し説明を加えました。はい、これらは非線形操作です。一般的な見出しは形態学的画像処理です。
ニキエストナー

1
@nikie気にしないでください、白は黒ではなく最大です。:-)
スペイシー

1
@gdelfino:私は通常、十分な大きさのマスクを使用して回避し、Clip[ImageData[white],{eps,Infinity}]安全のためにepsが小さい数字を使用します。
ニキエストナー

6

ニキーエの答えは最高のようであり、また、働き、結果を生み出しているようです。だからそれは明らかな勝者です。

ただし、ドキュメントにもう1つ参照を追加すると、非常に高速になります。

この手法は、適応しきい値処理と呼ばれ、バックグラウンドを明示的に学習する必要はありません。

基本的に、最適なグローバルしきい値を見つけるのではなく、ローカルウィンドウ(たとえば7x7程度)で画像を分割し、ウィンドウが移動するにつれて変化するしきい値を見つけることができます。

以下のリファレンスでは、正確な方法について詳しく説明しています。 http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm

この方法は、比較的計算が高速です。


これらの2つのことは本質的に同じではありませんか?つまり、しきい値処理の前に信号の局所平均を推定しますか?
モーリッツ

1
@Maurits主な違いは、使用される順序と統計です。たとえば、開始/終了演算子(膨張と収縮で構成されますが、順序は異なります)では、ウィンドウがラスタスキャンされ、最大値が取得されます。(とりわけ)。ただし、適応しきい値では、最大値の代わりに平均値/中央値を使用できます。
スペイシー

OP もSOで質問しましたが、私は答えました。しかし、原則として、答えに違いはないと思います。常にローカル統計を推定しています。適応しきい値処理を行う場合、プロセスの背景も学習します。
モーリッツ

6

バンドパスフィルターを使用する別の方法(MATLABで)。ガウスパラメーターの違いをいじると、より良い結果が得られる場合があります。このプロセスは、基本的に画像をバンドパスフィルター処理して低周波の背景ブロブを除去し、「graythresh」コマンドに必要な[0,1]に正規化する、しきい値の画像です。

画像を読み込み、グレースケールダブルに変換します。

I = imread('hw.jpg');
I = rgb2gray(I);
I = double(I);

ここに画像の説明を入力してください

ガウスカーネルの差を使用してフィルター処理し、正規化します。

J = imgaussian(I,1.5) - imgaussian(I,0.5);
J = J - min(J(:));
J = J / max(J(:));

ここに画像の説明を入力してください

しきい値を計算して010101を作成します。

T = J > graythresh(J);

ここに画像の説明を入力してください


4

これは、適応しきい値処理に適したMatlabコードです。http//www.mathworks.com/matlabcentral/fileexchange/8647-local-adaptive-thresholding


ああ!ただし、画像処理ツールボックスが必要です。:-/
スペイシー

確かに。お持ちでない場合は申し訳ありません。しかし、DIPImageはMatlab用の無料のImage Tolboxです。diplib.org/documentationしきい値設定(セグメンテーションセクションのチェック)のためのいくつかのメソッドがあり、終了などのすべての形態学的操作を行うこともできます。開発者にはブログcb.uu.se/~cris/blog/index.php/archives/tag/matlab
-MyCarta

0

このコーディングを試してみますが、正解がありません...

clc;
clear;
x=imread('base2.jpg');
size(x);
x=imresize(x,[500 800]);
figure;
imshow(x);
title('original image');
z=rgb2hsv(x);       %extract the value part of hsv plane
v=z(:,:,3);
v=imadjust(v);
m = mean(v(:))
s=std(v(:))
k=-2;
value=m+ k*s;
temp=v;
for p=1:1:500
    for q=1:1:800
        pixel=temp(p,q);
        if(pixel>value)
            temp(p,q)=1;
        else
            temp(p,q)=0;
        end
    end
end
figure;
imshow(temp);
title('result by niblack');
% k=kittlerMet(g);
% figure;
% imshow(k);
% title('result by kittlerMet');

val2=m*(1+.1*((s/128)-1));
t2=v;
for p=1:1:500
for q=1:1:800
    pixel=t2(p,q);
    if(pixel>value)
        t2(p,q)=1;
    else
        t2(p,q)=0;
    end
end

end
figure;
imshow(t2);
title('result by sauvola');

ここに画像の説明を入力してください

ここに画像の説明を入力してください


2
これが質問に答えることを意図している場合、あなたが何をしているのか、そしてその理由を説明してください。
マットL.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.