이 질문을받은 지 얼마되지 않았습니다. 나는 대답 하기엔 너무 늦지 않기를 바란다. 비슷한 질문에 유역 분할을 사용하는 일반적인 문제가 있습니다. 때로는 물체가 서로 닿지 않고 떨어져있어 like in this example. 이러한 경우에는 이미지를 흐리게하는 것만으로 유역 분할을 사용할 수 있습니다.때로는 물체가 밀접하게 접촉하여 서로 닿으므로 물체의 경계가 명확하지 않습니다. like in this example. 이 경우 distance transform -> blur -> watershed를 사용하면 도움이됩니다. 이 질문에서 논리적 접근은 거리 변환을 사용해야합니다. 그러나 이번에는 나무 근처의 그림자 때문에 경계가 명확하지 않습니다. 이 경우 객체 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 그루의 나무가 있습니다. –