0

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

图像1

结果是:

结果

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

1 回答 1

1

细分不是我的领域,所以我不确定最好的方法是什么。以下是我提出的一些启发式想法:

  1. 丢弃太大或太小的区域。

看起来您可以期望椎骨具有一定的大小。

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. 查看所需区域的图像时刻

分布的协方差矩阵的特征值表征其在其最宽方向上的大小以及垂直于该方向的大小。我们正在寻找胖圆盘形状,因此我们可以期望一个大的特征值和一个中等大小的特征值。

[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 行感兴趣,其中最大的特征值在 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

在此处输入图像描述

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

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

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

希望有帮助。

于 2015-03-05T23:49:42.840 回答