我有一张静脉图像,如上所示。我使用分水岭算法提取了静脉的骨架。
我的代码:(K是原始图像)。
level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);
结果如下:
结果为:
可以看到,很多信息都丢失了。有人能帮我吗?谢谢。
我有一张静脉图像,如上所示。我使用分水岭算法提取了静脉的骨架。
我的代码:(K是原始图像)。
level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);
结果为:
可以看到,很多信息都丢失了。有人能帮我吗?谢谢。
看起来灯光有点不均匀。可以使用某些形态学操作来纠正这种情况。基本思路是计算一个代表不均匀灯光的图像,并将其减去或者除以它(这也增强了对比度)。因为我们只想找到灯光,所以使用足够大的结构元素非常重要,这样该操作会考虑更全局的特性而非局部的。
%# 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
(中间)的结果以及其覆盖在原始图像上的效果:
im2bw
时,基本上是将uint8
图像转换为二进制图像(只使用logical
值),其中像素亮度从intmin('uint8')==0
到intmax('uint8')==255
。这就是您观察到的信息损失。
如果显示图像BW
,您会看到所有大于阈值level
的K
元素都变成了1,而小于阈值的都变成了0。是的,你需要降低阈值(很可能比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
64
而不是32
。哪种大小最合适将由图像中异质部分的大小确定。 - reve_etrange