2016-08-18 7 views
1

Я использую алгоритм водораздела, чтобы попытаться сегментировать трогательные ядра. Типичное изображение может выглядеть следующим образом: enter image description here или это: enter image description hereНастройка алгоритма водоразбора, удаляющая все подключенные компоненты

Я пытаюсь применить алгоритм водораздела с этим кодом:

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); Image description here

+0

BW = bwdist (BW) <= 1; оставляет все точки со значением 1, которые не превышают расстояния от одного пикселя до другого пикселя со значением 1. Если изображение является зернистым, может быть, что расстояние между точками со значением 1 больше 1, и эта строка кода удаляет их , как выглядит изображение BW после этой строки кода? –

+0

@AmitayNachmani После удаления этой строки изображение все равно становится темным? Я не уверен, почему, но, похоже, после 'C = ~ BW'. Благодаря! – Sam

+0

Как выглядит изображение перед BW = bwareaopen (BW, 8); и после? –

ответ

0

Перед верхней шлейфом вы должны выполнить закрытие и отверстие, чтобы уменьшить шум.

Если вы выполните открытие области на шумном изображении, вы можете получить результат на черно-белом изображении.

Так было бы:

  1. Закрытие и открытие
  2. Top-Hat
  3. Область открытия, если по-прежнему необходимо
  4. Thresholding
  5. Эрозия и дилатация найти внутренние и внешние маркеры соответственно
  6. Водораздел (никогда не используйте водораздел без маркеров).