3

Я использую функцию regionprops для определения количества деревьев на изображении, записанном дроном. Original ImageMatLab - Сегментация для разделения касательных объектов на изображении

Сначала я удалил землю с помощью голубой NDVI: Image BNDVI

Изображение с порога: Image with Threshold

Тогда я использовал функцию regionprops, чтобы определить количество деревьев на изображение: Regionprops

Но есть проблема в регионе 15, потому что все деревья в этой области связаны и обнаруживаются как одно дерево. я пытался разделить деревья на этой области, используя Watershed Segmentation, но ее не работает:

Watershed segmentation

Могу ли я это делаю неправильно? Есть ли лучший способ разделить деревья?

Если кто-нибудь может помочь мне с этой проблемой, я буду признателен. Вот область 15 без земли: Region 15

Если это помогает, вот величина градиента изображения: enter image description here

+0

Может ** ты ** сказать, сколько деревьев? если да, то как вы это сделали, какие подсказки помогли вам подсчитать разные деревья? – Shai

+0

Конечно, я не знаю, сколько деревьев на изображении, потому что даже подсчет вручную сложный. Но через функцию regionprops я могу знать область региона. И зная, что самое большее дерево имеет площадь 3000 пикселей, и что регион для изучения имеет 112 000 пикселей области, поэтому в регионе около 37 деревьев. –

ответ

4

Прошло некоторое время с тех пор, как этот вопрос был задан. Надеюсь, еще не поздно ответить. Я вижу общую проблему использования сегментации водораздела в подобных вопросах. Иногда объекты отделены друг от друга, не касаясь друг друга like in this example. В таких случаях достаточно размытия изображения достаточно, чтобы использовать сегментацию водоразделов.Иногда объекты расположены близко и касаются друг друга, поэтому границы объектов не ясны like in this example. В таких случаях помогает использование переходов -> размытие -> водораздел. В этом вопросе логический подход должен использовать дистанционное преобразование. Однако на этот раз границы не ясны из-за теней на деревьях и рядом с ними. В таких случаях полезно использовать любую информацию, которая помогает отделить объекты as in here или подчеркнуть сами объекты.

В этом вопросе я предлагаю использовать информацию о цвете, чтобы подчеркнуть пиксели дерева.
Вот коды и результаты MATLAB.

im=imread('https://i.stack.imgur.com/aBHUL.jpg'); 
im=im(58:500,86:585,:); 
imOrig=im; 

%% Emphasize trees 

im=double(im); 
r=im(:,:,1); 
g=im(:,:,2); 
b=im(:,:,3); 

tmp=((g-r)./(r-b)); 

figure 
subplot(121);imagesc(tmp),axis image;colorbar 
subplot(122);imagesc(tmp>0),axis image;colorbar 

%% Transforms 

% Distance transform 
im_dist=bwdist(tmp<0); 

% Blur 
sigma=10; 
kernel = fspecial('gaussian',4*sigma+1,sigma); 
im_blured=imfilter(im_dist,kernel,'symmetric'); 

figure 
subplot(121);imagesc(im_dist),axis image;colorbar 
subplot(122);imagesc(im_blured),axis image;colorbar 

% Watershed 
L = watershed(max(im_blured(:))-im_blured); 
[x,y]=find(L==0); 

figure 
subplot(121); 
imagesc(imOrig),axis image 
hold on, plot(y,x,'r.','MarkerSize',3) 

%% Local thresholding 

trees=zeros(size(im_dist)); 
centers= []; 
for i=1:max(L(:))  
    ind=find(L==i & im_blured>1); 
    mask=L==i; 

    [thr,metric] =multithresh(g(ind),1); 
    trees(ind)=g(ind)>thr*1; 

    trees_individual=trees*0; 
    trees_individual(ind)=g(ind)>thr*1; 

    s=regionprops(trees_individual,'Centroid'); 
    centers=[centers; cat(1,[],s.Centroid)]; 
end 

subplot(122); 
imagesc(trees),axis image 
hold on, plot(y,x,'r.','MarkerSize',3) 

subplot(121); 
hold on, plot(centers(:,1),centers(:,2),'k^','MarkerFaceColor','r','MarkerSize',8) 

enter image description here

enter image description here

enter image description here

+0

SUPER! : D (ограничение на 15 символов) –

+0

Это предложение, безусловно, поможет мне и даст самое близкое приближение, которое у меня было до сих пор. большое спасибо –

1

Вы можете попробовать маркер на основе водораздел. Преобразования ванильных водоразделов никогда не работают из коробки в моем опыте. Один из способов его выполнения - создать карту расстояний сегментированной области, используя imdist(). Тогда вы можете подавить локальные максимумы, вызвав imhmax(). Тогда вызов водораздела() обычно будет заметно улучшаться.

Вот пример сценария о том, как это сделать:

bwTrees = imopen(bwTrees, strel('disk', 10)); 
%stabilize the borders to lessen oversegmentation 

distTrees = -bwDist(~bwTrees); %Distance transform 

distTrees(~bwTrees) = -Inf; %set background to -Inf 

distTrees = imhmin(distTrees, 3); %suppress local minima 

basins = watershed(distTrees); 
ridges = basins == 0; 

segmentedTrees = bwTrees & ~ridges; %segment 

segmentedTrees = imopen(segmentedTrees, strel('disk', 2)); 
%remove 'segmentation trash' caused by oversegmentation near the borders. 

Я возился с параметрами для ~ 10мин, но получил довольно плохие результаты:

segmented trees

Вы должны были бы вложите в это дело. В основном в до- и после обработки по морфологии. Более кривизна помогла бы сегментации, если бы вы могли снизить чувствительность сегментации в первой части. Представляет интерес также размер преобразования h-minima. Вероятно, вы можете получить адекватные результаты.

Вероятно, лучший подход может прийти из мира методов кластеризации. Если у вас есть или можно найти способ оценки количества деревьев в лесу, вы должны использовать традиционные методы кластеризации для сегментирования деревьев. Гауссовая модель смеси или k-средство с k-деревьями, вероятно, будут работать намного лучше, чем водораздел, основанный на марке, если вы получите даже почти правильное количество деревьев. Обычно я оцениваю количество деревьев на основе количества подавленных максимумов по преобразованию h-maxima, но ваши метки могут быть немного слишком полезными для этого. Однако стоит попробовать.

+0

Спасибо за предложение .. Я постараюсь, а затем опубликую здесь, если он решит. –

 Смежные вопросы

  • Нет связанных вопросов^_^