Я столкнулся с массой проблем, пытаясь заставить алгоритм водораздела правильно работать с моими изображениями. В различных онлайн-учебниках они всегда используют изображения, которые столь же сложны / нечетки, и поэтому я не уверен, что не так с моим. Я уже сделал пару пятнистых постов по этому поводу, но хотел действительно уточнить и спросить в целом. Тем не менее, я использую такие изображения, как:
Однако, когда я пытаюсь применить один из алгоритмов водораздела:
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;
, чтобы изображение не было фрагментировано AS:
Как показано на первом изображении, должно быть 3 ячейки, и хотя водораздел распознает две отдельные ячейки слева, он регистрирует больше, чем должен (даже после объединения). Я не добился большого прогресса после всего, что я пробовал, поэтому любая помощь или предложения будут очень признательны.
Пройдя процедуру полного водораздела, я получаю такие максимумы, как: