2017-03-08 9 views
1

ここは私の画像です a.pngこの画像に大津法を使って良いバイナリ画像を得るにはどうすればいいですか?

二値化用このコードを試してみます。

im=rgb2gray(I); 
maxp=uint16(max(max(im))); 
minp=uint16(min(min(im))); 
bw=im2bw(im,(double(minp+maxp))/(1.42*255)); 
bw=~bw; 
imm=bw; 

しかし、私はotsuメソッドを使用して良いバイナリ出力を得ることができますotsu.howで二値化が必要ですか? PLZ

おかげ

答えて

0

を助けるMATLABはmultithreshと呼ばれるOtsu thresholdingの独自の実装を持っています。私はそれが私はそれがあなたのイメージで実行する方法をよく知っていないテストしていません

im=rgb2gray(I); % convert image to grayscale 
thresh = multithresh(im); % find one threshold (using Otsu method) 

segmented_im = imquantize(im, thresh); % segment image 
imagesc(segmented_im); % show segmented image 

:あなたのケースではセグメント化された画像を取得するためのコードは次のようなものでなければなりません。

EDIT:

が、私はそれをテストし、期待どおりに動作しません。問題の1つは、ピクセル強度の明確な二峰性分布が存在する場合、大津の方法がうまく機能することである。この二峰性はあなたのイメージに欠けています。

enter image description here

あなたが見ることができるように、一方で、分布はほとんど三峰性で、かつmultithreshによって選択された閾値が最初のものである:階調変換後のimhist(im)への呼び出しは、この(私が追加されたコメント)につながりますあなたは2番目のものが欲しい。あなたのデータセット内のすべての画像が投稿したものと似ている、つまり似たような輝度分布を持っている場合は、multithreshに2つのスレッシュホールドを出力し、最後の(最高の)ものを選択することです。

thresholds = multithresh(im, 2); 
thresh = thresholds(end); 

次に、前述のように画像のセグメント化を進めます。この第二の方法は、このセグメント化につながる:

enter image description here

EDIT 2(すべて一緒にそれを置く):

実際に出力segmented_imは、バイナリイメージが、ラベル画像ではありません。バイナリイメージに変換するのは簡単です。

im=rgb2gray(I); % convert image to grayscale 
thresholds = multithresh(im, 2); % find two thresholds using Otsu 
thresh = thresholds(end); % select larger one 

segmented_im = imquantize(im, thresh); % segment image 

segmented_im(segmented_im == 1) = 0; % make background black (0) 
segmented_im(segmented_im == 2) = 255; % make foreground white (255) 

binary_im = im2bw(segmented_im); % make binary (logical) image 

imshow(binary_im); % show binary image 

binary_im ILの論理行列(0)偽背景、および前景(1)真:私は直接次のスニペットのすべてのコードを含むであろう。 segmented_imは、背景が0、前景が255のダブル・マトリックスです。これがあなたの目的に役立つことを願っています

+0

動作しません! –

+0

私は答えを編集しました。この問題は、ピクセル強度の非バイモーダル分布にあるかもしれない。これは、標準的な単一閾値の大津法がうまくいくために必要なことである。 – UJIN

+0

これはバイナリイメージですか?白い地下と黒の背景はどこですか? –

関連する問題