从距离变换中寻找中心线

时间:2016-07-19 14:57:47

标签: matlab image-processing image-segmentation

给定二进制输入图像,我想从距离变换中提取中心线。我已经取得了一些成果,但是,我想知道是否:

  1. 整个过程可以更有效地完成,即减少步骤数,避免阈值等。
  2. 如何恢复我错误检测到的某些区域(线条间隙),例如看看最后一张图片中的红色椭圆。
  3. Input Image enter image description here 代码如下:

    im=im2bw(imread('test.tif'));
    figure(1), subplot(3,2,1)
    imshow(im,[]);
    title('Input Image');
    
    imd=bwdist(~im);
    subplot(3,2,2)
    imshow(imd,[]);
    title('Euclidean Distance Transform');
    
    %imw=watershed(imd);
    %imw=imw==0;
    log=del2(imd);
    subplot(3,2,3)
    imshow(log,[]);
    title('Laplacian of Gaussian');
    
    imp=bwperim(im);
    se=strel('disk',1);
    imp=imdilate(imp,se);
    subplot(3,2,4)
    imshow(imp,[]);
    title('Dilated Perimeter');
    
    bin=log < -0.2;
    mask=bin-imp;
    mask=mask>0;
    subplot(3,2,5)
    imshow(mask,[]);
    title('Binazired mask');
    
    rp = regionprops(mask, 'PixelIdxList', 'Area');
    rp = rp(vertcat(rp.Area) > 30);
    
    centerline=zeros(size(im));
    centerline(vertcat(rp.PixelIdxList))=1;
    centerline=bwmorph(centerline,'thin');
    subplot(3,2,6)
    imshow(centerline,[]);
    title('Final mask');
    

    算法的步骤如下:

    • 从二进制图像计算距离变换。
    • 应用高斯拉普拉斯算子。我希望中心线上的负值很大。
    • LoG的阈值响应,删除原始二进制图像边界上的像素,并保留长度至少为30像素的行。

0 个答案:

没有答案