を助ける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つは、ピクセル強度の明確な二峰性分布が存在する場合、大津の方法がうまく機能することである。この二峰性はあなたのイメージに欠けています。

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

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のダブル・マトリックスです。これがあなたの目的に役立つことを願っています
動作しません! –
私は答えを編集しました。この問題は、ピクセル強度の非バイモーダル分布にあるかもしれない。これは、標準的な単一閾値の大津法がうまくいくために必要なことである。 – UJIN
これはバイナリイメージですか?白い地下と黒の背景はどこですか? –