如何解决流域中的过分割问题

时间:2015-12-08 10:48:43

标签: matlab image-processing watershed mathematical-morphology image-morphology

我的输入图片是

enter image description here

输出图像是

enter image description here

预期输出是这样的

enter image description here

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

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

1 个答案:

答案 0 :(得分:-2)

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

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

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

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

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

这是我做的:

  1. 小开口(方形顺序1,方形更快更好,因为你的病人在图像中很好地定向,否则是圆盘或六边形)以增加椎骨与它们的邻域之间的差距。
  2. 区域开口(表面23,但并不重要)为了压平不同的区域,所以要擦除峰值。
  3. 区域关闭(表面23,但实际上并不重要),以便再次压平不同区域,因此填充孔。此时请参阅image result。看,一切看起来都比较顺畅,但不同的边界/轮辋仍然完好无损。
  4. 终极开放(UO)。
  5. 根据最终开放结果(残留物,值和指标)进行阈值处理。请参阅vertebras approximation。我已经没有了这些值(我删除了我的代码),但你可以查看UO结果并找回它们。但是,如果你愿意,我仍然有UO结果。
  6. 打开(磁盘顺序7)以消除所有伪影和误报(椎骨很大)
  7. 与5相同的操作,以便近似您想要分割的小图案。请参阅results
  8. 在步骤7中对结果进行小的侵蚀以便具有外部标记(在椎骨之间)。我用步骤6的结果的大膨胀(磁盘顺序11)的边界完成外部标记。
  9. 以下是我the markers
  10. 带有计算标记的分水岭,这里是preliminary result
  11. 你要分割的模式是在椎骨之间,所以我猜这个结果会缩小很多感兴趣的区域。

    它对你有用吗?

    我无法分享代码,但我想您应该在MatLab中找到所有内容。

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