2012-04-15 34 views
5

enter image description hereMatlab - 分水嶺提取線條 - 丟失信息

我有一個靜脈圖像如下。我使用分水嶺算法來提取靜脈的骨架。

我的代碼:(K是原始圖像)。

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

結果是:

enter image description here

正如你可以看到大量的信息丟失。有人可以幫我嗎?謝謝。

回答

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); 

這裏是C(左),加上DL==0(中心)和它的原始圖像上疊加:

Divided by closingOtsu's methodSegmentation overlay

+0

效果很好。不過,圖片會很好。 – Jonas 2012-04-16 03:31:57

+0

良好的建議...(見編輯)。 – 2012-04-16 03:37:09

+0

非常感謝您的幫助。只是一個簡單的問題。 如果我想申請IMOPEN隨後imclose我應該修改這部分 SE = strel(「方」,32); im_open = imopen(A,se); B = imdivide(A,imclose(im_open,se)); 我正在閱讀的論文現在正在閱讀,他們說這樣使用可以大大減少錯誤的分支。但是,當我這樣做時,似乎有更多的假分支哈哈。你有什麼建議嗎?謝謝 – W00f 2012-04-16 16:37:26

1

是的,你需要有可能降低你的閾值(比大津的方法是給你更低)。如果在降低閾值時邊緣圖有噪聲,則應在應用二維高斯平滑濾波器之前降低閾值。這會稍微移動邊緣,但也會清理噪音,所以這是一個折衷。

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 

東西之前,你申請你的算法的其餘部分。

1

你失去的信息,因爲當你申請im2bw,你基本上轉換您uint8圖像,其中像素亮度需要從intmin('uint8')==0intmax('uint8')==255值,爲二進制圖像(其中只使用logical值)。這就意味着你觀察到的信息丟失。 如果顯示的圖像BW你會看到這有一個大於閾值level轉成者越大的K所有元素,而低於閾值轉成零的那些人。