1

極小値を見つける必要があるグレースケール画像のセットがあります。私は Matlab でコードを書いており、アルゴリズムを構築する方法についての提案を探しています: 勾配を計算する必要がありますか、watershedそれとも関数を使用できますか?

これは、最初の分析に使用したコードです (下の画像)。

IM_c = imcomplement(IM);
L = watershed(IM_c);
Lrgb = label2rgb(L);
figure; hold on;
subplot(3,1,1); imshow(IM_c); hold on;
subplot(3,1,2); imshow(Lrgb);hold on;
subplot(3,1,3); imshow(imfuse(IM_c,Lrgb));

ここに画像の説明を入力

直感的に、矢印が指すピクセルで局所的な最小値を見つけることが期待されます。
ここに画像の説明を入力

4

3 に答える 3

2

Adi Shavit が述べたように、画像は非常にノイズが多いです。これは、画像上で流域を直接使用すると、過剰なセグメンテーションにつながります (画像全体に多くの極値があるため)。

画像を滑らかにするために、何らかの前処理を実行する必要があります。ぼかしを使用したくない場合はimreconstruct、極値を見つける前に形態学的再構成 ( ) を試すことができます。

% if img is your original grayscale image

wSize = 6;
se = strel('disk', wSize);

% opening by reconstruction - to remove specks in the dark background
imgEroded = imerode(img, se);
imgRecon = imreconstruct(imgEroded, img);

imgReconComp = imcomplement(imgRecon);

% opening by reconstruction - to homogenize the pixels in the foreground(clouds)
imgEroded2 = imerode(imgReconComp, se);
imgRecon2 = imreconstruct(imgEroded2, imgReconComp);

minima = imregionalmin(imgRecon2);

元の画像に重ねられた最小値は次のようになります -

http://i.stack.imgur.com/bPHh0.png

構造化要素のサイズ/形状を試して、より良い結果が得られるかどうかを確認できます。

極値をシードとして使用して、勾配画像で流域セグメンテーションを実行することもできますが、これでは意味のある結果が得られない可能性があります (とにかくセグメンテーションを実行しようとしているようには見えません)。

于 2015-05-06T11:59:46.370 に答える