连通分量分析错误

时间:2015-03-05 04:20:53

标签: matlab image-processing connected-components

我正在尝试进行连接组件分析。但是我遇到了错误。我需要椎体;但我得到一些其他物体。 图片是:

image1

结果是:

result

    im= imread('im.bmp');
    figure,imshow(im);
    K1=imadjust(im);
    figure, imshow(K1), title('After Adjustment Image')
    threshold = graythresh(K1);
    originalImage = im2bw(K1, threshold);

    originalImage = bwareaopen(originalImage,100);
    se = strel('disk', 2); %# structuring element
    closeBW = imclose(originalImage,se);

    figure,imshow(closeBW);

    CC = bwconncomp(closeBW);
    L = labelmatrix(CC);
    L2 = bwlabel(K1);
    figure, imshow(label2rgb(L));

1 个答案:

答案 0 :(得分:1)

细分不在我的区域,因此我不确定最佳方法是什么。以下是我提出的几个启发式想法:

  1. 丢弃太大或太小的区域。
  2. 看起来您可以从脊椎中获得一定的尺寸。

    regionIdxs = unique(L(:));
    regionSizes = accumarray(L(:)+1,1);
    

    如果我们查看regionSizes,我们会看到区域大小(以像素为单位):

      213360
         919
         887
         810
         601
         695
       14551
         684
        1515
         414
         749
         128
         173
       26658
    

    您想要的区域(第2-6行)的范围是500-1000。我们可以安全地丢弃大小<200或> 2000的区域。

    goodRegionIdx = (regionSizes>200) & (regionSizes<2000);
    regionIdxs = regionIdxs(goodRegionIdx);
    regionSizes = regionSizes(goodRegionIdx);
    
    1. 查看所需区域的image moments
    2. 分布的协方差矩阵的特征值表征其在最宽方向上的大小和与该方向垂直的大小。我们正在寻找脂肪盘形状,因此我们可以期待一个大的特征值和一个中等大小的特征值。

      [X,Y] = meshgrid(1:size(L,2),1:size(L,1));
      for i = 1:length(regionIdxs)
          idx = regionIdxs(i);
          region = L==idx;
          totalmass = sum(region(:));
      
          Ex(i)  = sum( X(1,:).*sum(region,1) )  / totalmass;
          Ey(i)  = sum( Y(:,1).*sum(region,2))   / totalmass;
          Exy(i) = sum(sum( X.*Y.*region ))      / totalmass;
          Exx(i) = sum(sum( X.*X.*region ))      / totalmass;
          Eyy(i) = sum(sum( Y.*Y.*region ))      / totalmass;
      
          Varx(i)  = Exx(i) - Ex(i)^2;
          Vary(i)  = Eyy(i) - Ey(i)^2;
          Varxy(i) = Exy(i) - Ex(i)*Ey(i);
      
          Cov = [Varx(i) Varxy(i); Varxy(i) Vary(i)];
      
          eig(i,:) = eigs(Cov);
      end
      

      如果我们查看特征值eig

        177.6943   30.8029
        142.4484   35.9089
        164.6374   26.2081
        112.6501   22.7570
        138.1674   24.1569
         89.8082   58.8964
        284.2280   96.9304
         83.3226   15.9994
        113.3122   33.7410
      

      我们只对第1-5行感兴趣,第1-5行的特征值在最大值100-200范围内,第二行50以下。如果我们丢弃这些,请获取以下区域:

      goodRegionIdx = (eig(:,1)>100) & (eig(:,1)<200) & (eig(:,2)<50);
      regionIdxs = regionIdxs(goodRegionIdx);
      

      我们可以使用逻辑OR |来绘制区域。

      finalImage = false(size(L));
      for i = 1:length(regionIdxs)
          finalImage = finalImage | (L==regionIdxs(i) );
      end
      

      enter image description here

      我们似乎得到一个假阳性。查看特征值eig(:,1)./eig(:,2)的比率是一个想法,但这似乎也有点问题。

      您可以尝试某种异常值检测,如RANSAC,以尝试消除您不想要的区域,因为真正的椎骨往往沿着线或曲线在空间上对齐。

      我不确定还有什么建议。如果您无法找到另一种区分好与坏的方法,您可能需要研究更高级的分割方法,如机器学习。有一个更严格的预处理方法可能是一件事。

      希望有所帮助。