Прошло некоторое время с тех пор, как этот вопрос был задан. Надеюсь, еще не поздно ответить. Я вижу общую проблему использования сегментации водораздела в подобных вопросах. Иногда объекты отделены друг от друга, не касаясь друг друга 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)
Может ** ты ** сказать, сколько деревьев? если да, то как вы это сделали, какие подсказки помогли вам подсчитать разные деревья? – Shai
Конечно, я не знаю, сколько деревьев на изображении, потому что даже подсчет вручную сложный. Но через функцию regionprops я могу знать область региона. И зная, что самое большее дерево имеет площадь 3000 пикселей, и что регион для изучения имеет 112 000 пикселей области, поэтому в регионе около 37 деревьев. –