Matlabを使用して画像をセグメント化するために流域を適用する方法は?


7

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

流域を使用してこの画像をセグメント化して、画像内の人物のみを取得する方法は?

これまでに次のことを行いました。

  1. 勾配を計算しました

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

  1. 流域変換を計算しました

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

私のコード:

  clear;
I=imread('inpaint.jpg');
I=rgb2gray(I);

hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);


figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)')
L = watershed(gradmag);
% Lrgb = label2rgb(L);
 figure, imshow(L), title('Watershed transform of gradient magnitude (Lrgb)')

流域の適用に成功しました

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

元の画像でオブジェクトの輪郭を描いて、セグメント化して表示できるかどうか知りたいですか?


多少正接しますが、大学または企業のMATLABの画像処理ライセンスを使用していますか?私はそれを調べました、そしてそれはかなり高価であるようです:-/
Spacey

はい、私の大学にはライセンスがあります...
vini

1
@Mohammad Octaveは、MATLABの画像処理ツールボックスのほぼすべての機能を備えており、多くの場合、コードには互換性があります。

@reve_etrangeああありがとうございます!! 私はそれを調査する必要があります-私の古い上司は常に、それが大きなマトリックスを保持できない、MATLABのような素敵なGUIではないなど、オクターブについて悪いことをいつも言っていたので、実際には調査しませんでした...
Spacey

@Mohammadまた、Scilabの画像処理ツールボックスは成長し、繁栄しています。それがまだあなたが探しているものを提供しているかどうかわかりません。
フォノン

回答:


8

Watershed変換はその入力を地形図として扱い、その地形に水で浸水することをシミュレートすることを思い出してください。「流域」または「流域」は、マップの他の領域にこぼれることなく「水を保持」する部分です。

勾配の大きさは、そのままではセグメンテーション関数としては不十分です。ノイズと開いた輪郭は、画像の極端な過剰分割につながります。おおよその前景マーカーと背景マーカーを作成することを目的として、一連の形態学的操作を試行し、これらを使用してグラデーションの不要な部分を削除できます。

%# Normalize.
g = gradmag - min(gradmag(:));
g = g / max(g(:));

th = graythresh(g); %# Otsu's method.
a = imhmax(g,th/2); %# Conservatively remove local maxima.
th = graythresh(a);
b = a > th/4; %# Conservative global threshold.
c = imclose(b,ones(6)); %# Try to close contours.
d = imfill(c,'holes'); %# Not a bad segmentation by itself.
%# Use the rough segmentation to define markers.
g2 = imimposemin(g, ~ imdilate( bwperim(a), ones(3) );
L = watershed(g2);

これは問題なく動作します。人々のグループとその影の両方をリージョンとして取得し、少しノイズを出します。

目標について詳しく説明していただけますか?つまり、多くの異なる画像をセグメント化するのでしょうか、それともこの例に非常に類似した画像だけをセグメント化するのでしょうか。影を無視して、重なり合う2人を分離する必要がありますか?

あなたがこれらの質問に答えたら、私は答えを更新しようとします。

セグメンテーションオーバーレイ

セグメンテーションをオーバーレイする方法を尋ねました。1つの方法は、ウォーターシェッドラインを使用して元のピクセルを指定し、明るい色に設定することです。

boundaries = L == 0;
I(boundaries) = 255;

私のイメージのすべては、セグメンテーションの悪い手段であると考え、このimage..Isn'tのしきい値によって描かと同じ条件を持っているとはい、私は別のオブジェクトとしてそれらを表示したい
VINI

しきい値処理は、奇数のヒストグラムを持つ画像に奇妙な結果をもたらす可能性があり、特定のしきい値は通常、単一の画像に対してのみ役立ちますが、それらについて本質的に「悪い」ものはありません。Otsuの方法は、コンピュータービジョンコーダーのツールボックス内にある必要があります-盲目的に適用しないでください。

はい、ありますが、適用したときの結果は満足のいくものではありませんでした
vini

セグメンテーションの結果を確認して、それで十分ですか?=)
vini 2012年

@vini:オブジェクトがフォアグラウンドの一部なのかバックグラウンドなのかを判断する必要があるため、画像のセグメンテーションでは、ある時点で何らかのしきい値処理が必要になります。
ジョナス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.