2

我的输入图像是

在此处输入图像描述

输出图像是

在此处输入图像描述

预期的输出是这样的

在此处输入图像描述

可以看出,一些类似椭圆的结构与矩形合并。此外,我无法将每个标签分开以获得椭圆使用的算法是分水岭

clear; close all;
I = imread('Sub.png');
I = rgb2gray(I);
figure; imshow(I)
I2 = imtophat(I, strel('square', 45));
figure; imshow(I2)
% Alpha=.047;
% h = fspecial('motion', 10, 5);
% w=gausswin(I2,Alpha)  % you'll have to play with N and alpha
% I2 = imfilter(I2,h,'same','symmetric'); % something like these options
level = .047;
BW = im2bw(I2,level);
D = -bwdist(~BW,'chessboard');
D(~BW) = -Inf;

L = watershed(D);
imshow(label2rgb(L,'jet','w'))

最终开启代码:

ImageSource=imread('cameraman.tif');
ImTmp=ImageSource
ImResidue = zeros(size(ImageSource));
ImIndicator= zeros(size(ImageSource));
ImValues= zeros(size(ImageSource));
For size= 1 : N
se = strel('square',N);
ImOp  = imopen(ImageSource,se);
ImDiff=imabsdiff(ImOp,ImTmp)
if ImResidue < ImDiff then
               ImResidue = ImDiff
               ImIndicator = size
               ImValues = ImOp
end
ImTmp=ImOp
end
4

1 回答 1

-2

如果你想要准确的东西,你必须使用带标记的分水岭,但这会更加棘手。默认情况下,基本分水岭分段,因为它使用每个局部最小值作为标记。

因此,您必须对图像进行一点预处理,以增加要分割的对象之间的分离度,然后使用标记来引导您的分水岭。

[根据你编辑编辑]如果你只想要椎骨之间的小结构,那么我建议进行小侵蚀以增加它们之间的间隙,然后是最终开口。当椎骨需要更大的椎骨时,您想要的结构会因半径较小而消失。

不要忘记在渐变图像上使用标记。

[编辑2,初步结果]我很好奇你的问题,所以我试了一下。我没有去椎骨之间的小区域(你想要分割的那个),而是尝试首先分割椎骨(你想要它们之间的那个)。

这是我所做的:

  1. 小开口(方形 1 阶,方形更快更精细,因为您的患者在图像中方向良好,否则为圆盘或六边形),以增加椎骨与其邻域之间的间隙。
  2. 区域开口(表面 23,但这并不重要)为了使不同的区域变平,所以抹去峰。
  3. 区域闭合(表面 23,但这并不重要)以再次展平不同的区域,因此填充孔。此时查看图像结果。看,一切看起来都更平滑了,但不同的边界/边缘仍然完好无损。
  4. 终极开放(UO)。
  5. 根据最终打开结果(残基、值和指标)进行阈值处理。参见椎骨近似。我没有这些值了(我已经删除了我的代码),但是您可以查看 UO 结果并找到它们。但是,如果您愿意,我仍然有 UO 结果。
  6. 打开(磁盘顺序 7)以擦除所有伪影和误报(椎骨很大)
  7. 与 5 相同的操作,以近似您想要分割的小模式。查看结果
  8. 步骤 7 上的结果小腐蚀,以便有外部标记(椎骨之间)。我用步骤 6 的结果的大膨胀(磁盘顺序 11)的边界来完成外部标记。
  9. 这是我得到的标记。
  10. 带有计算标记的分水岭,这是初步结果

您要分割的模式在椎骨之间,所以我猜这个结果缩小了很多感兴趣的区域。

对你起作用吗?

我不能分享代码,但我想你应该在 MatLab 中找到所有内容。

您可以通过检测矩形形状来改进此结果。

于 2015-12-08T19:50:23.000 回答