2017-05-22 63 views
1

我正在使用分水嶺算法來分割深色背景上的亮點。代碼在下面提供,以及它生成的一些圖像。如何防止分水嶺算法中封閉背景區域的不準確分割?

在第二幅圖像中,我用紅色標記將封閉背景的區域標記爲「細胞」(它們不是生物細胞,只是使用單詞) - 這是不正確的,它們是部分的背景,只是被'細胞'所包圍。我發現這會產生一個錯誤的最小值,對於如何防止這種情況有幫助?

% Improve contrast, binarize 
RFP_adjust = imadjust(RFP_blur, stretchlim(RFP_blur, 0.001)); 
figure, imshow(RFP_adjust), title('Contrast adjust'); 
RFP_binarized = imbinarize(RFP_adjust); 
RFP_perimeters = bwperim(RFP_binarized); 
% figure, imshow(RFP_binarized), title('Otsu thresholding'); 

    %2B - SEGMENTATION BY WATERSHED METHOD 
    % Discover putative cell centroids and process 
RFP_maxs = imextendedmax(RFP_adjust, 3000); 
RFP_maxs = imclose(RFP_maxs, strel('disk',5)); 
RFP_maxs = imfill(RFP_maxs, 'holes'); 
RFP_maxs = bwareaopen(RFP_maxs, 5); 
RFP_max_overlay = imoverlay(RFP_adjust, RFP_perimeters | RFP_maxs, [1 .3 .3]); 
figure, imshow(RFP_max_overlay), title('Maxima'); 

    % Obtain complement - maxima become low-points (required for watershed) 
RFP_comp = imcomplement(RFP_adjust); 
RFP_imposemin = imimposemin(RFP_comp, ~RFP_binarized | RFP_maxs); 
figure, imshow(RFP_imposemin), title('Inverted Maxima'); 

    % Apply watershed 
RFP_watershed = watershed(RFP_imposemin); 
mask = im2bw(RFP_watershed, 1); 
overlay3 = imoverlay(RFP_adjust, mask, [1 .3 .3]); 
figure, imshow(overlay3), title('Segmented cells'); 

    % Segment 
RFP_cc = bwconncomp(RFP_watershed); 
RFP_label_matrix = labelmatrix(RFP_cc); 
whos labeled; 
RFP_label = label2rgb(RFP_label_matrix, @spring, 'c', 'shuffle'); 
figure, imshow(RFP_label), title('Cells segmented'); 

圖像0​​ - 「Maxima」圖像的結果(即調整後的原始圖像的最大值和輪廓被覆蓋)。 enter image description here

圖像1 - 結果用於圖像標題爲「倒置最大值」 Result for image titled 'Inverted Maxima'

圖像2 - 結果爲標題爲「細胞分段」 enter image description here

+0

沒有你的原始起始圖像看起來很難,但有什麼辦法可以確定什麼像素被定義爲背景?之後您可以將其作爲掩碼在執行分水嶺操作時忽略這些區域。 – gnovice

+0

@gnovice,添加了原始圖片(圖片0)。我使用了這個鏈接中描述的方法: 「我們需要修改我們的圖像,使得單元格邊界具有最高強度,並且背景清晰標記(我們標記爲負無窮大)。通過首先找到應該近似對應於細胞核的最大值,然後我們轉換圖像,使得背景像素和這些最大值是圖像中唯一的局部最小值:「 http://blog.pedro.si/2014 /04/basic-cell-segmentation-in-matlab.html – Sovm

回答

1

我會建議像the example included for the watershed function這樣做:使用背景蒙版將這些像素設置爲Inf,執行分水嶺操作,然後將結果中的背景像素設置爲0.我相信您可以更改分水嶺部分你的代碼就像這樣實現這一點:

% Apply watershed 
RFP_watershed = RFP_imposemin;    % Added 
RFP_watershed(~RFP_binarized) = Inf;  % Added 
RFP_watershed = watershed(RFP_watershed); % Modified 
RFP_watershed(~RFP_binarized) = 0;   % Added 
mask = im2bw(RFP_watershed, 1); 
overlay3 = imoverlay(RFP_adjust, mask, [1 .3 .3]); 
figure, imshow(overlay3), title('Segmented cells'); 
+0

謝謝!代碼起作用,我理解意圖/邏輯,語法有點不熟悉,但我可以弄清楚。 – Sovm

+0

後續問題 - 什麼是'RFP_watershed(〜RFP_binarized)= Inf; 「在做什麼?在控制檯中添加'RFP_watershed(〜RFP_binarized)'會創建一個長的列矩陣... – Sovm

+1

@SoumitraBhoyar:由於'RFP_binarized'是一個邏輯矩陣。0和1),您可以使用它執行[邏輯索引](https://www.mathworks.com/help/matlab/math/matrix-indexing.html#bq7egb6-1)。實質上,'〜RFP_binarized'的值都是1,'Inf'的值將放在'RFP_watershed'中的相應位置。 '〜'運算符(「not」運算符)只是翻轉'RFP_binarized'中的零和1。 – gnovice

0

有沒有魔術子彈圖像,但幾件事情你可以試試。

一個是用一個非常大的圓盤過濾圖像,創建一個看起來像背景的模糊圖像。然後從原始圖像中減去它。這往往會迫使實際背景爲零。

另一個是大津閾值將前景與背景分開。這會創建一個二進制圖像。然後使用設計爲看起來像實際細胞的面罩進行形態學開放操作。

+0

恐怕答案的第一部分不起作用。問題不在於背景與前景之間的對比度不足,而是當您使用分水嶺並創建倒數最大值時,程序似乎沒有辦法區分倒數最大值('最小值')和低背景值。第二點 - 沒有辦法告訴'細胞'是什麼樣子 - 它們是不規則的團塊,而不是生物細胞。 – Sovm