Как предотвратить неточную сегментацию замкнутых фоновых областей в алгоритме водораздела?

Я использую алгоритм водораздела, чтобы сегментировать яркие пятна на темном фоне. Код приведен ниже вместе с некоторыми изображениями, которые он генерирует.

На втором изображении я пометил красными крестиками области закрытого фона, которые сегментированы как "клетки" (это не биологические клетки, просто слово) - это неправильно, они являются частью фона, просто заключенный в "клетки". Я вижу, что это создает ложный минимум, любая помощь о том, как предотвратить это?

    % 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 - результат для изображения с названием "Максима" (т.е. откорректированное исходное изображение с наложенными максимумами и контурами). введите описание изображения здесь

Изображение 1 - результат для изображения с названием 'inverted maxima' Результат для изображения под названием

Изображение 2 - результат для изображения с названием 'Cells segmented' введите описание изображения здесь

2 ответа

Решение

Я хотел бы предложить что-то вроде того, что сделано в примере, включенном для watershed Функция: используйте маску фона, чтобы установить эти пиксели 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');

Там нет волшебной пули, но есть несколько вещей, которые вы можете попробовать.

Одним из них является фильтрация изображения с очень большим круглым диском, создавая размытое изображение, похожее на фон. Затем вычтите его из исходного изображения. Это будет стремиться заставить фактический фон к нулю.

Другим является отсечение порога для отделения переднего плана от фона. Это создает двоичное изображение. Затем выполните морфологическую операцию открытия, используя маску, разработанную так, чтобы она выглядела как настоящие клетки.

Другие вопросы по тегам