3

Ich benutze die Funktion regionprops, um die Anzahl der Bäume auf einem Bild zu erkennen, das von einer Drohne aufgenommen wurde. Original ImageMatLab - Segmentierung, um sich berührende Objekte in einem Bild zu trennen

Zuerst entfernte ich den Boden unter Verwendung von Blau NDVI: Image BNDVI

Bild mit Schwelle: Image with Threshold

Dann habe ich die Funktion regionprops die Anzahl der Bäume auf dem Bild zu erkennen: Regionprops

Es gibt jedoch ein Problem in Region 15, da alle Bäume in dieser Region verbunden sind und es als ein Baum erkennt. Ich habe versucht, auf diesem Gebiet die Bäume zu trennen Watershed Segmentation verwenden, aber es funktioniert nicht:

Watershed segmentation

Bin ich dies für die falsche Art und Weise zu tun? Gibt es eine bessere Methode, um die Bäume zu trennen?

Wenn mir jemand mit diesem Problem helfen kann, werde ich zu schätzen wissen. Hier ist der Bereich 15 ohne Boden: Region 15

Wenn es hilft, hier ist die Gradient Magnitude Bild: enter image description here

+0

Kann ** ** Sie sagen, wie viele Bäume gibt es? Wenn ja, wie hast du es gemacht, welche Hinweise haben dir geholfen, die verschiedenen Bäume zu zählen? – Shai

+0

Natürlich kann ich nicht wissen, wie viele Bäume im Bild sind, weil sogar das manuelle Zählen schwierig ist. Aber durch die Funktion der Regionsprops kann ich das Gebiet der Region kennenlernen. Und wenn man weiß, dass höchstens ein Baum eine Fläche von 3000 Pixeln hat und dass die zu untersuchende Region 112.000 Pixel Fläche hat, so hat die Region etwa 37 Bäume. –

Antwort

4

Es ist eine Weile her, seit diese Frage gestellt wurde. Ich hoffe, es ist nicht zu spät für eine Antwort. Ich sehe ein generelles Problem der Wasserscheide-Segmentierung in ähnlichen Fragen. Manchmal sind die Objekte auseinander, berühren sich nicht like in this example. In solchen Fällen genügt es, das Bild nur zu verwischen, um die Wassersegmentsegmentierung zu verwenden.Manchmal sind die Objekte dicht beieinander und berühren sich gegenseitig, so dass die Grenzen der Objekte nicht klar sind like in this example. In solchen Fällen hilft die Verwendung von Entfernungstransformation -> Unschärfe -> Wasserscheide. In dieser Frage sollte der logische Ansatz die Entfernungstransformation verwenden. Diesmal sind die Grenzen jedoch aufgrund von Schatten auf und in der Nähe der Bäume nicht klar. In solchen Fällen ist es sinnvoll, Informationen zu verwenden, die die Objekte as in here trennen oder Objekte selbst hervorheben.

In dieser Frage empfehle ich die Verwendung von Farbinformationen, um Baumpixel zu betonen.
Hier sind die MATLAB-Codes und Ergebnisse.

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 Zeichen Min. Limit) –

+0

Dieser Vorschlag wird mir definitiv helfen und wird die beste Annäherung geben, die ich bisher hatte. Vielen Dank –

1

Sie könnten versuchen, einen Marker-basierten Wendepunkt. Vanilla Watershed-Transformationen funktionieren nach meiner Erfahrung nicht von der Stange. Eine Möglichkeit, eine solche durchzuführen, besteht darin, zuerst eine Entfernungskarte des segmentierten Bereichs unter Verwendung von imdist() zu erstellen. Dann könnten Sie lokale Maxima unterdrücken, indem Sie imhmax() aufrufen. Dann wird das Aufrufen von Watershed() normalerweise merklich besser funktionieren.

Hier ist ein Beispielskript auf, wie es geht:

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. 

ich um für ~ 10 Minuten mit den Parametern getüftelt bekam aber ziemlich schlechte Ergebnisse:

segmented trees

Sie benötigen würde gießen Sie Arbeit hinein. Meist in Vor- und Nachbearbeitung über die Morphologie. Eine stärkere Krümmung würde die Segmentierung unterstützen, wenn Sie die Empfindlichkeit der Segmentierung im ersten Teil verringern könnten. Die Größe der h-Minima-Transformation ist ebenfalls ein Parameter von Interesse. Sie können wahrscheinlich auf diese Weise angemessene Ergebnisse erzielen.

Wahrscheinlich würde ein besserer Ansatz aus der Welt der Clustering-Techniken kommen. Wenn Sie eine Möglichkeit zur Schätzung der Anzahl der Bäume in der Gesamtstruktur haben oder finden können, sollten Sie in der Lage sein, traditionelle Clustermethoden zum Ausgliedern der Bäume zu verwenden. Ein Gaussian-Mischmodell oder ein k-means mit k-Bäumen würde wahrscheinlich viel besser funktionieren als eine markerbasierte Wasserscheide, wenn Sie sogar fast die richtige Menge an Bäumen bekommen. Normalerweise würde ich die Anzahl der Bäume basierend auf der Anzahl der unterdrückten Maxima auf einer h-Maxima-Transformation schätzen, aber Ihre Etiketten könnten dafür ein bisschen zu wurstartig sein. Es ist jedoch einen Versuch wert.

+0

Danke für den Vorschlag .. Ich werde versuchen und dann hier posten, wenn es gelöst wird. –

Verwandte Themen