连通分量分析错误
connected component analysis error
我正在尝试连接组件 analysis.but 我遇到了错误。我需要椎体;但我得到了一些其他物体。
图片是:
结果是:
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));
分割不是我的领域,所以我不确定最好的方法是什么。以下是我提出的几个启发式想法:
- 丢弃太大或太小的区域。
看起来您可以期望椎骨具有一定的尺寸。
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);
- 查看 image moments 个所需区域。
分布的协方差矩阵的特征值表征了它在最宽方向上的大小以及垂直于该方向的大小。我们正在寻找胖圆盘形状,因此我们可以期待一个大的特征值和一个中等大小的特征值。
[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);
我们可以使用逻辑或 |
.
绘制区域
finalImage = false(size(L));
for i = 1:length(regionIdxs)
finalImage = finalImage | (L==regionIdxs(i) );
end
我们似乎得到了一个误报。查看特征值的比率 eig(:,1)./eig(:,2)
是一种想法,但这似乎也有点问题。
您可以尝试某种异常值检测,例如 RANSAC 来尝试消除您不想要的区域,因为真正的椎骨往往在空间上沿着直线或曲线对齐。
我不确定还有什么建议。如果您找不到另一种方法来区分好坏,您可能需要研究更高级的分割方法,如机器学习。尝试更严格的预处理方法可能是一回事。
希望对您有所帮助。
我正在尝试连接组件 analysis.but 我遇到了错误。我需要椎体;但我得到了一些其他物体。 图片是:
结果是:
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));
分割不是我的领域,所以我不确定最好的方法是什么。以下是我提出的几个启发式想法:
- 丢弃太大或太小的区域。
看起来您可以期望椎骨具有一定的尺寸。
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);
- 查看 image moments 个所需区域。
分布的协方差矩阵的特征值表征了它在最宽方向上的大小以及垂直于该方向的大小。我们正在寻找胖圆盘形状,因此我们可以期待一个大的特征值和一个中等大小的特征值。
[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);
我们可以使用逻辑或 |
.
finalImage = false(size(L));
for i = 1:length(regionIdxs)
finalImage = finalImage | (L==regionIdxs(i) );
end
我们似乎得到了一个误报。查看特征值的比率 eig(:,1)./eig(:,2)
是一种想法,但这似乎也有点问题。
您可以尝试某种异常值检测,例如 RANSAC 来尝试消除您不想要的区域,因为真正的椎骨往往在空间上沿着直线或曲线对齐。
我不确定还有什么建议。如果您找不到另一种方法来区分好坏,您可能需要研究更高级的分割方法,如机器学习。尝试更严格的预处理方法可能是一回事。
希望对您有所帮助。