Я использую алгоритм водораздела, чтобы попытаться сегментировать трогательные ядра. Типичное изображение может выглядеть следующим образом: или это: Настройка алгоритма водоразбора, удаляющая все подключенные компоненты
Я пытаюсь применить алгоритм водораздела с этим кодом:
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;
. Я экспериментировал тонну, и я действительно не знаю, что происходит. Любая помощь будет замечательной!
Ps. это изображение после BW = bwareaopen(BW,8);
BW = bwdist (BW) <= 1; оставляет все точки со значением 1, которые не превышают расстояния от одного пикселя до другого пикселя со значением 1. Если изображение является зернистым, может быть, что расстояние между точками со значением 1 больше 1, и эта строка кода удаляет их , как выглядит изображение BW после этой строки кода? –
@AmitayNachmani После удаления этой строки изображение все равно становится темным? Я не уверен, почему, но, похоже, после 'C = ~ BW'. Благодаря! – Sam
Как выглядит изображение перед BW = bwareaopen (BW, 8); и после? –