2016-08-22 148 views
1

我碰到一噸試圖讓分水嶺算法正常工作在我的圖像的麻煩。在線上的各種教程中,他們似乎總是使用同樣複雜/模糊的圖像,所以我不確定我的問題。我已經在這方面做了幾個有點點的帖子,但是想真正地澄清並提出一般問題。這就是說,我使用的相似圖片: 正確利用Matlab分水嶺算法來分割細胞

然而,當我嘗試應用的分水嶺算法之一:

imshow(RGB,[]); 

gray_img = rgb2gray(RGB); 
tophat_filter = imtophat(gray_img, strel('disk', 10)); %Read into this 

level = graythresh(tophat_filter); 
BW = im2bw(tophat_filter,level); 
imshow(BW) 

BW = bwdist(BW) <= 3; 

imshow(BW) 
bgn_remove = bwareaopen(BW,8); %remove background noise 

D = -bwdist(~bgn_remove); %Read into this 
D(~BW) = -Inf; 
L = watershed(D); 

figure; 
imshow(L,[]); 
figure; 
imshow(label2rgb(L)) 
clean_img = im2bw(L,0.001); 

figure; 
imshow(clean_img,[]); 

它似乎永遠不會工作。無論出於何種原因,它決定了每個單元由一堆規模較小的: enter image description here

我試圖通過與BW = bwdist(BW) <= 3;結塊的segmeneted組件來解決這個問題,使圖像不AS支離破碎:

enter image description here

如在第一圖像中顯示有應該是3個細胞,並且在不分水嶺識別關於左兩個截然不同的細胞它註冊多個比它應該(即使結塊之後)。 我已經嘗試過的所有事情都沒有取得太大的進展,所以任何幫助或建議都會非常感激。

通過全流域程序去後,我結束了最大值,如:

enter image description here

enter image description here

enter image description here

回答

1

你必須使用分水嶺種子/受限/標記。如果您使用經典(不再使用)的分水嶺,則會面臨過度分割。

在你的情況,我會做這個經典方法段使用分水嶺細胞:

  1. 小閉幕,以減少噪音。
  2. (可選)小開口來調整細胞邊緣。
  3. 侵蝕。侵蝕的結果是你的內在標誌。
  4. 膨脹。擴張的結果是你的外在標誌。
  5. 步驟1後產生的圖像的梯度(如果您做了,則爲2)。
  6. 流域中的梯度圖像(步驟5)上,使用標記(步驟3和4)。

但是在你的情況下,如果這樣定義良好的單元格,我會簡單地執行第1步和第2步,然後是高頂禮帽。它將會同樣有效並且更快。

+0

非常感謝您的幫助。但是,我對此很新,並且有幾個問題:對於第1步,是「小關閉」像'imclose'這樣的形態關閉嗎?或者更喜歡用'bwareaopen'來減少噪音?對於第2步,是規範的細胞輪輞甚至他們出來?如果是的話,它與第1步有什麼不同?我想我理解第3步和第4步,但我會更多地考慮它們。在第5/6步,我不確定我如何使用這些特定標記預製分水嶺 - 似乎與一般情況不同。無論如何,你可以提供一些這些步驟的示例代碼? – Sam

+0

1 /是的,當bwareaopen在黑白圖像上打開一個區域時(這裏不是您的情況),封閉會進行關閉。 2 /這只是不規則的形狀。正如我所說,這是可選的。步驟1將主要在單元格中間刪除所有的灰塵效果,當步驟1之後的步驟2將主要影響輪廓。 5/6對於漸變,使用Sobel。對於分水嶺,尋找種子(也稱爲約束)版本,然後梯度圖像和標記將成爲參數的一部分。抱歉,我不使用MatLab。 – FiReTiTi

+0

真棒,謝謝。你也提到使用'tophat',有什麼理由爲什麼這會導致細胞大部分消失?使用步驟1和2後,圖像看起來更清晰,我是否可以單獨使用這些分水嶺?或者,首先使用侵蝕擴大/或頂帽方法會更有意義嗎? – Sam