【问题标题】:Implement Adaptive watershed segmentation in Matlab在 Matlab 中实现自适应分水岭分割
【发布时间】:2016-07-31 16:15:03
【问题描述】:

我想在 Matlab 中实现“自适应分水岭分割”。 该算法有六个步骤。输入是图(a),结果是图(d)。 请你帮我检查一下我的代码有没有错误,我不知道如何实现第六步。 非常感谢!

加载图片:

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

Step3 : 逐像素扫描标记图。如果 M(x0,y0) 为 1,则在其半径为 D(x ,y ) 的邻域中寻找虚假最大值。当 M(x,y) 等于 1 且 sqr((x − x0)^2 + (y − y0)^2 ) ≤ D(x0, y0) ,如果 D(x,y)

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);

第五步:

通过常规分水岭算法根据标记对距离图进行分割,得到二值图像的分割。

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

第 6 步:通过用直线连接分水岭线的末端并沿直线重新分类像素来拉直分水岭线。

我不知道如何实现这一步

【问题讨论】:

    标签: algorithm matlab image-processing image-segmentation watershed


    【解决方案1】:

    尝试距离变换,然后是分水岭变换。

    im=imread('n6BRI.gif');
    
    imb=bwdist(im);
    
    sigma=3;
    kernel = fspecial('gaussian',4*sigma+1,sigma);
    im2=imfilter(imb,kernel,'symmetric');
    
    L = watershed(max(im2(:))-im2);
    [x,y]=find(L==0);
    
    lblImg = bwlabel(L&~im);
    
    figure,imshow(label2rgb(lblImg,'jet','k','shuffle'));
    

    【讨论】:

      猜你喜欢
      • 2011-09-08
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      • 2016-12-29
      • 1970-01-01
      • 2011-11-17
      相关资源
      最近更新 更多