Алгоритм сегментации водораздела для сегментации закрытых листьев в Matlab

Основная задача состоит в том, чтобы удалить сложный фон листа и извлечь целевой лист из закрытого изображения листа в MATLAB. Чтобы устранить фон, я применил алгоритм кластеризации K-средних. Теперь основная задача состоит в том, чтобы отделить лист от закрытого листа, используя алгоритм сегментации водораздела. Я не могу найти идеальные сегменты для каждого отдельного листа. Пожалуйста помогите. Я загрузил примеры изображений, а также код сегментации водораздела.

ИСХОДНОЕ ИЗОБРАЖЕНИЕ введите здесь описание изображения

Изображение после удаления фона с использованием алгоритма кластеризации K-Means и сегментации водораздела, наложенной на исходное изображение enter image  описание здесь

Я хочу, чтобы основной средний лист был одним сегментом, чтобы я мог его извлечь.

Я дал код сегментации водораздела ниже

function wateralgo(img)

F=imread(img);

F=im2double(F);

%Converting RGB image to Intensity Image
r=F(:,:,1);
g=F(:,:,2);
b=F(:,:,3);
I=(r+g+b)/3;
imshow(I);

%Applying Gradient
hy = fspecial('sobel');
hx = hy';
Iy = imfilter(double(I), hy, 'replicate');
Ix = imfilter(double(I), hx, 'replicate');
gradmag = sqrt(Ix.^2 + Iy.^2);
figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)');

L = watershed(gradmag);
Lrgb = label2rgb(L);
figure, imshow(Lrgb), title('Watershed transform of gradient magnitude (Lrgb)');

se = strel('disk',20);
Io = imopen(I, se);
figure, imshow(Io), title('Opening (Io)');
Ie = imerode(I, se);
Iobr = imreconstruct(Ie, I);
figure, imshow(Iobr), title('Opening-by-reconstruction (Iobr)');

Ioc = imclose(Io, se);
figure, imshow(Ioc), title('Opening-closing (Ioc)');

Iobrd = imdilate(Iobr, se);
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
Iobrcbr = imcomplement(Iobrcbr);
figure, imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)');

fgm = imregionalmin(Iobrcbr);
figure, imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)');

I2 = I;
I2(fgm) = 255;
figure, imshow(I2), title('Regional maxima superimposed on original image (I2)');

se2 = strel(ones(7,7));
fgm2 = imclose(fgm, se2);
fgm3 = imerode(fgm2, se2);
fgm4 = bwareaopen(fgm3, 20);
I3 = I;
I3(fgm4) = 255;
figure, imshow(I3), title('Modified regional maxima superimposed on original image (fgm4)');

bw = im2bw(Iobrcbr, graythresh(Iobrcbr));
figure, imshow(bw), title('Thresholded opening-closing by reconstruction (bw)');

D = bwdist(bw);
DL = watershed(D);
bgm = DL == 0;
figure, imshow(bgm), title('Watershed ridge lines (bgm)');

gradmag2 = imimposemin(gradmag, bgm | fgm4);
L = watershed(gradmag2);
I4 = I;
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255;
figure, imshow(I4), title('Markers and object boundaries superimposed on original image (I4)');

Lrgb = label2rgb(L, 'jet', 'w', 'shuffle');
figure, imshow(Lrgb), title('Colored watershed label matrix (Lrgb)');

figure, imshow(I), hold on
himage = imshow(Lrgb);
set(himage, 'AlphaData', 0.3);
title('Lrgb superimposed transparently on original image');
end

person Rohit Kalaghatkar    schedule 23.04.2012    source источник
comment
@Phonon Извините, в коде плохой отступ, но, пожалуйста, помогите мне найти решение.   -  person Rohit Kalaghatkar    schedule 23.04.2012
comment
какой лист вы пытаетесь извлечь?   -  person vini    schedule 29.04.2012
comment
В каком диапазоне условий окружающей среды должен работать ваш алгоритм сегментации листьев? Есть ли у вас контроль над сценой? Обязательно ли использовать алгоритм водораздела? Я не уверен, что информация о градиенте достаточно сильна, чтобы дать вам надежное решение. Вероятно, вам нужен алгоритм или модель, которая позволит вам использовать более сильные априорные данные. Форма листьев довольно стереотипна, поэтому, возможно, будет уместно взглянуть на деформируемую модель. Если времени мало, возможно, эвристический подход, основанный на расширении регионов, может дать быстрые результаты?   -  person William Payne    schedule 01.05.2012
comment
@vini Мы пытаемся извлечь лист, который покрывает максимальную часть изображения. Какой когда-либо лист, который находится в центре. И уберите остальные другие листья.   -  person Rohit Kalaghatkar    schedule 02.05.2012
comment
@WilliamPayne Алгоритм сегментации листьев должен работать для отдельных листьев и скрытых листьев со сложным фоном, таких как другие листья, почва, остатки, стебель, ветви и т. д. После применения алгоритма сегментации водораздела мы не можем должным образом контролировать сегментацию листьев. . Лист с большей частью, покрывающий изображение, а также лист, который находится в центре, должен быть извлечен, а все остальные должны быть удалены. Алгоритм нуждается в доработке. Пожалуйста, предложите мне другой подход, который работает еще лучше.   -  person Rohit Kalaghatkar    schedule 02.05.2012


Ответы (2)


Я думаю, вам следует попробовать алгоритм извлечения переднего плана, а не общую сегментацию. Одним из таких алгоритмов является GrabCut. Еще одна вещь, которая может быть полезна, — это добиться некоторого уровня дисперсии освещения в вашем представлении изображения, прежде чем пытаться извлечь объект переднего плана. Один из способов сделать это — работать в цветовом пространстве Chong.

person nojka_kruva    schedule 08.05.2012

Если возможно какое-либо взаимодействие с пользователем, ваша сегментация будет намного лучше либо с GrabCut (как упоминал @Victor May), либо с более простым интерактивный график.

В противном случае автоматическую сегментацию очень сложно усовершенствовать для различных изображений. Возможно, вы могли бы попробовать некоторую постобработку, при которой соседние регионы сравниваются и объединяются на основе показателя сходства (или на основе силы градиента между двумя сегментами?).

person Noremac    schedule 30.05.2012