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)
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
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. –