Matlabで「適応型流域セグメンテーション」を実装したいと考えています。 このアルゴリズムには6つのステップがあります。入力はfigure(a)、結果はfigure(d)です。 私のコードに間違いがあるかどうかを確認するのを手伝ってください、私は第六のステップをどのように実装するのか分かりません。 ありがとうございました!Matlabで適応的な流域セグメンテーションを実装する
ロード画像:
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 + 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:
セグメント距離マップ従来の流域アルゴリズムによってマーカに係る2値画像のセグメンテーションを得ます。
I2 = imimposemin(igfDT,M);
L = watershed(I2);
igfDT (L==0)=0;
ステップ6:直線で流域線の両端を結ぶ直線に沿ったピクセルを再分類することによって流域線をまっすぐ。
私は