Matlab - Водораздел для извлечения строк - потерянная информация

введите здесь описание изображения

У меня есть изображение вены, как показано ниже. Я использую алгоритм водораздела для извлечения скелета вены.

Мой код: (K - исходное изображение).

level = graythresh(K);
BW = im2bw(K,level);
D = bwdist(~BW);
DL = watershed(D);
bgm = DL == 0;
imshow(bgm);

Результат:

введите здесь описание изображения

Как видите, много информации теряется. Кто-нибудь может мне помочь? Спасибо.


person W00f    schedule 15.04.2012    source источник


Ответы (3)


Кажется, что освещение несколько неравномерно. Это можно исправить с помощью определенных морфологических операций. Основная идея состоит в том, чтобы вычислить изображение, представляющее только неравномерное освещение, и вычесть его или разделить на него (что также увеличивает контраст). Поскольку мы хотим найти только освещение, важно использовать достаточно большой структурирующий элемент, чтобы операция исследовала больше глобальных свойств, чем локальных.

%# Load image and convert to [0,1].
A = im2double(imread('http://i.stack.imgur.com/TQp1i.png'));
%# Any large (relative to objects) structuring element will do.
%# Try sizes up to about half of the image size.
se = strel('square',32);
%# Removes uneven lighting and enhances contrast.
B = imdivide(A,imclose(A,se));
%# Otsu's method works well now.
C = B > graythresh(B);
D = bwdist(~C);
DL = watershed(D);
imshow(DL==0);

Вот C (слева), плюс DL==0 (в центре) и их наложение на исходное изображение:

Разделено замыканиемМетод Оцу Наложение сегментации

person reve_etrange    schedule 16.04.2012
comment
Работает хорошо. Хотя фото было бы неплохо. - person Jonas; 16.04.2012
comment
Большое спасибо за Вашу помощь. Только один быстрый вопрос. Если я хочу применить imopen, а затем imclose, я должен просто отредактировать эту часть se = strel('square',32); im_open = imopen(A,se); B = imdivide (A, imclose (im_open, se)); В статье, которую я сейчас читаю, они сказали, что использование этого способа может сильно помочь в уменьшении количества ложных ветвей. Однако, когда я сделал это таким образом, кажется, что ложных ветвей стало больше, лол. Есть ли у вас предложения? Спасибо - person W00f; 16.04.2012
comment
Изображение, которое я использовал, находится здесь img534.imageshack.us/img534/8876/testrlt.png - person W00f; 16.04.2012
comment
Вероятно, речь идет об использовании открытого/закрытого изображения напрямую, а не о разделении на него. См. здесь для получения дополнительной информации об этой технике. Идея состоит в том, чтобы сделать регионы более однородными. - person reve_etrange; 16.04.2012
comment
Попробуйте использовать элемент структурирования большего размера, например 64 вместо 32. Какой размер лучше всего подходит, будет определяться размером разнородных частей изображения. - person reve_etrange; 16.04.2012

Вы теряете информацию, потому что, применяя im2bw, вы фактически конвертируете изображение uint8, где яркость пикселей принимает значение от intmin('uint8')==0 до intmax('uint8')==255, в бинарное изображение (где используются только значения logical). Именно это и влечет за собой потерю информации, которую вы наблюдали. Если вы отобразите изображение BW, вы увидите, что все элементы K, значение которых превышает пороговое значение level, превращаются в единицы, а те, что ниже порогового значения, превращаются в нули.

person Drodbar    schedule 15.04.2012

Да, скорее всего, вам придется снизить порог (ниже, чем дает вам метод Оцу). И если карта ребер зашумлена, когда вы снижаете пороговое значение, вы должны применить 2-мерный фильтр сглаживания по Гауссу, прежде чем понижать пороговое значение. Это немного сдвинет края, но также уберет шум, так что это компромисс.

2-D Gaussian можно применить, делая что-то вроде

w=gausswin(N,Alpha)  % you'll have to play with N and alpha
K = imfilter(K,w,'same','symmetric'); % something like these options

Прежде чем применить остальную часть вашего алгоритма.

person Chris A.    schedule 15.04.2012