Правильное использование алгоритма водораздела 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,[]);

Кажется, это никогда не работает. По какой-то причине он определяет, что каждая ячейка состоит из множества меньших:

Я попытался обойти это, скомбинировав сегментированные компоненты с BW = bwdist(BW) <= 3; так что изображение не так фрагментировано:

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

После прохождения полной процедуры водораздела я получаю максимумы, такие как:

1 ответ

Вы должны использовать сеяный / ограниченный / водораздел маркеров. Если вы используете классический (больше не используемый) водораздел, вы столкнетесь с чрезмерной сегментацией.

В вашем случае я бы использовал этот классический подход для сегментирования ячеек с использованием водораздела:

  1. Небольшое закрытие, чтобы уменьшить шум.
  2. (необязательно) Небольшое отверстие для регуляции обода ячеек.
  3. Эрозия. Результатом эрозии является ваш внутренний маркер.
  4. Растяжение. Результатом расширения является ваш внешний маркер.
  5. Градиент результирующего изображения после шага 1 (или 2, если вы это сделали).
  6. Водораздел на градиентном изображении (шаг 5), используя маркеры (шаги 3 и 4).

Но в вашем случае с такими четко очерченными ячейками я бы просто выполнил шаги 1 и 2, а затем цилиндр. Это будет так же эффективно и намного быстрее.

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