2

Matlab で「Adaptive Watershed Segmentation」を実装したいと思います。このアルゴリズムには 6 つのステップがあります。入力は図(a)、結果は図(d)です。私のコードに誤りがないかどうかを確認するのを手伝っていただけませんか。6 番目のステップの実装方法がわかりません。どうもありがとう!

入力画像

結果イメージ

画像をロード:

input_image = imread('test.gif');

ステップ 1 : 各 (x,y) で D(x,y) を計算し、バイナリ イメージのユークリッド距離マップを取得し、M(x,y) の各値を 0 として割り当てます。

DT = bwdist(input_image,'euclidean'); % Trandform distance:Euclidian distance 
[h,w]=size(DT);
M = zeros(h,w);

ステップ 2 : ガウス フィルターを使用して距離マップを平滑化し、隣接する最大値をマージし、D(x,y) が極大値の場合は M(x,y) を 1 に設定し、距離マップのマーカー マップを取得します。

H = fspecial('gaussian');
gfDT = imfilter(DT,H); 
M = imregionalmax(gfDT); % maker map, M = local maximum of gfDT

ステップ 3 : マーカー マップをピクセル単位でスキャンします。M(x0,y0) が 1 の場合、その近傍で半径 D(x ,y ) の疑似最大値を探します。M(x,y) が 1 で、sqr((x − x0)^2 + (y − y0)^2 ) ≤ D(x0, y0) 、D(x,y) < D(x0,y0) の場合、M(x,y) を 0 に設定します。

for x0 = 1:h
    for y0 = 1:w
        if M(x0,y0) == 1
            r = ceil(gfDT(x0,y0));

            % range begin:(x0-r,y0-r) end:(x0+r,y0+r)
            xb = x0-r;
            if xb <= 0
                xb =1;
            end

            yb = y0-r;
            if yb <= 0
                yb =1;
            end

            xe = x0+r;
            if xe > w
            xe = w;
            end

            ye = y0+r;
            if ye > h
                ye = h;
            end

            for x = yb:ye
                for y = xb:xe
                    if M(x,y)==1 
                        Pos = [x0,y0 ;x,y];
                        Dis = pdist(Pos,'euclidean');
                        IFA = Dis<= (gfDT(x0,y0));
                        IFB = gfDT(x,y)<gfDT(x0,y0);
                        if ( IFA && IFB)
                            M(x,y) = 0;
                        end
                    end
                end
            end
        end
    end
end

ステップ 4:

距離マップの逆数を計算すると、極大値が極小値になります。

igfDT = -(gfDT);

STEP5:

従来の流域アルゴリズムによるマーカーに従って距離マップをセグメント化し、バイナリ イメージのセグメンテーションを取得します。

I2 = imimposemin(igfDT,M);
L = watershed(I2);
igfDT (L==0)=0;

ステップ 6: 流域線の端を直線で結び、直線に沿ってピクセルを再分類することにより、流域線をまっすぐにします。

このステップを実装する方法がわかりません

4

1 に答える 1