Правильное использование алгоритма водораздела 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, если вы это сделали).
- Водораздел на градиентном изображении (шаг 5), используя маркеры (шаги 3 и 4).
Но в вашем случае с такими четко очерченными ячейками я бы просто выполнил шаги 1 и 2, а затем цилиндр. Это будет так же эффективно и намного быстрее.