Matlab - 分水岭提取线条 - 丢失信息

5

enter image description here

我有一张静脉图像,如上所示。我使用分水岭算法提取了静脉的骨架。

我的代码:(K是原始图像)。

level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);

结果如下:

结果为:

在这里输入图片描述

可以看到,很多信息都丢失了。有人能帮我吗?谢谢。

3个回答

8

看起来灯光有点不均匀。可以使用某些形态学操作来纠正这种情况。基本思路是计算一个代表不均匀灯光的图像,并将其减去或者除以它(这也增强了对比度)。因为我们只想找到灯光,所以使用足够大的结构元素非常重要,这样该操作会考虑更全局的特性而非局部的。

%# Load image and convert to [0,1].
A = im2double(imread('http://i.stack.imgur.com/TQp1i.png'));
%# Any large (relative to objects) structuring element will do.
%# Try sizes up to about half of the image size.
se = strel('square',32);
%# Removes uneven lighting and enhances contrast.
B = imdivide(A,imclose(A,se));
%# Otsu's method works well now.
C = B > graythresh(B);
D = bwdist(~C);
DL = watershed(D);
imshow(DL==0);

以下是原始图像(左侧),加上DL==0(中间)的结果以及其覆盖在原始图像上的效果:

Divided by closing Otsu's method Segmentation overlay


运行良好。不过加上图片会更好。 - Jonas
非常感谢您的帮助。只有一个快速的问题。 如果我想应用imopen后跟imclose,我应该只编辑这一部分吗?se = strel('square',32); im_open = imopen(A,se); B = imdivide(A,imclose(im_open,se));在我现在阅读的论文中,他们说使用这种方法可以大大减少虚假分支。然而,当我按照这种方式操作时,似乎出现了更多的虚假分支。您有什么建议吗?谢谢 - W00f
我使用的图片在这里 http://img534.imageshack.us/img534/8876/testrlt.png - W00f
他们可能在谈论直接使用打开/关闭的图像,而不是将其分割。请参见此处以获取有关此技术的更多信息。该想法是使区域更加同质化。 - reve_etrange
尝试使用更大的结构元素,如64而不是32。哪种大小最合适将由图像中异质部分的大小确定。 - reve_etrange

1
您正在丢失信息,因为当您使用im2bw时,基本上是将uint8图像转换为二进制图像(只使用logical值),其中像素亮度从intmin('uint8')==0intmax('uint8')==255。这就是您观察到的信息损失。 如果显示图像BW,您会看到所有大于阈值levelK元素都变成了1,而小于阈值的都变成了0。

1

是的,你需要降低阈值(很可能比Otsu方法给出的要低)。如果在降低阈值时边缘地图嘈杂,应在降低阈值之前应用一个二维高斯平滑滤波器。这将略微移动边缘,但也会清除噪声,因此需要权衡。

可以通过执行类似以下操作来应用2-D高斯:

w=gausswin(N,Alpha)  % you'll have to play with N and alpha
K = imfilter(K,w,'same','symmetric'); % something like these options

在应用算法的其余部分之前。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接