Настройка алгоритма Watershed, удаляющая все подключенные компоненты
Я использую алгоритм водораздела, чтобы попытаться сегментировать касающиеся ядра. Типичное изображение может выглядеть так: или это:
Я пытаюсь применить алгоритм водораздела с этим кодом:
show(RGB_img)
%Convert to grayscale image
I = rgb2gray(RGB_img);
%Take structuring element of a disk of size 10, for the morphological transformations
%Attempt to subtract the background from the image: top hat is the
%subtraction of the open image from the original
%Morphological transformation to subtract background noise from the image
%Tophat is the subtraction of an opened image from the original. Remove all
%images smaller than the structuring element of 10
I1 = imtophat(I, strel('disk', 10));
%Increases contrast
I2 = imadjust(I1);
%show(I2,'contrast')
%Assume we have background and foreground and assess thresh as such
level = graythresh(I2);
%Convert to binary image based on graythreshold
BW = im2bw(I2,level);
show(BW,'C');
BW = bwareaopen(BW,8);
show(BW,'C2');
BW = bwdist(BW) <= 1;
show(BW,'joined');
%Complement because we want image to be black and background white
C = ~BW;
%Use distance tranform to find nearest nonzero values from every pixel
D = -bwdist(C);
%Assign Minus infinity values to the values of C inside of the D image
% Modify the image so that the background pixels and the extended maxima
% pixels are forced to be the only local minima in the image (So you could
% hypothetically fill in water on the image
D(C) = -Inf;
%Gets 0 for all watershed lines and integers for each object (basins)
L = watershed(D);
show(L,'L');
%Takes the labels and converts to an RGB (Using hot colormap)
fin = label2rgb(L,'hot','w');
% show(fin,'fin');
im = I;
%Superimpose ridgelines,L has all of them as 0 -> so mark these as 0(black)
im(L==0)=0;
clean_img = L;
show(clean_img)
По какой-то причине после C = ~BW;
все изображение темнеет. Этот тот же самый блок кода работал с несколькими другими изображениями, все из которых были более "твердыми" или не такими зернистыми, как эти. Тем не менее, я думал, что компенсировал это BW = bwdist(BW) <= 1;
, Я экспериментировал много, и я действительно не знаю, что происходит. Любая помощь будет отличной!
1 ответ
Перед цилиндром вы должны выполнить закрытие и открытие, чтобы уменьшить шум.
Если вы выполняете открытие области на зашумленном изображении, вы можете получить результат на черно-белом изображении.
Так было бы:
- Закрытие и открытие
- Цилиндр
- Открытие области, если все еще необходимо
- Thresholding
- Эрозия и расширение, чтобы найти внутренние и внешние маркеры соответственно
- Водораздел (никогда не используйте водораздел без маркеров).