我正在使用分水嶺算法來分割深色背景上的亮點。代碼在下面提供,以及它生成的一些圖像。如何防止分水嶺算法中封閉背景區域的不準確分割?
在第二幅圖像中,我用紅色標記將封閉背景的區域標記爲「細胞」(它們不是生物細胞,只是使用單詞) - 這是不正確的,它們是部分的背景,只是被'細胞'所包圍。我發現這會產生一個錯誤的最小值,對於如何防止這種情況有幫助?
% 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」圖像的結果(即調整後的原始圖像的最大值和輪廓被覆蓋)。
沒有你的原始起始圖像看起來很難,但有什麼辦法可以確定什麼像素被定義爲背景?之後您可以將其作爲掩碼在執行分水嶺操作時忽略這些區域。 – gnovice
@gnovice,添加了原始圖片(圖片0)。我使用了這個鏈接中描述的方法: 「我們需要修改我們的圖像,使得單元格邊界具有最高強度,並且背景清晰標記(我們標記爲負無窮大)。通過首先找到應該近似對應於細胞核的最大值,然後我們轉換圖像,使得背景像素和這些最大值是圖像中唯一的局部最小值:「 http://blog.pedro.si/2014 /04/basic-cell-segmentation-in-matlab.html – Sovm