3

드레 이언이 가져온 이미지의 트리 수를 감지하기 위해 regionprops 함수를 사용하고 있습니다. 임계 값 Image BNDVIMatLab - 이미지에서 서로 닿는 객체를 분리하는 분할

이미지 : Original Image

먼저 나는 블루 NDVI를 사용하여 지상을 제거 Regionprops

: 나는이 기능은 이미지에 나무의 수를 감지하는 regionprops 사용 그런 Image with Threshold

그러나 영역 15에는 문제가 있습니다. 영역의 모든 트리가 연결되어 하나의 트리로 감지되기 ​​때문입니다. 내가 Watershed Segmentation을 사용하여 해당 지역에 나무를 분리하려하지만이 작동하지 :

Watershed segmentation

내가이 길을 잘못하고 있는가? 나무를 분리하는 더 좋은 방법이 있습니까?

누구든지이 문제에 대해 도움을 주시면 감사하겠습니다. 그것은 여기에, 도움이 그라데이션 크기 이미지의 경우 Region 15

: enter image description here

+0

** 당신은 ** 얼마나 많은 나무가 말할 수 있습니까? 그렇다면 어떻게 했습니까? 다른 나무를 세는 데 도움이되는 단서는 무엇입니까? – Shai

+0

확실히, 수동으로 계산하는 것이 까다 롭기 때문에 이미지에 트리가 얼마나 있는지 알 수 없습니다. 그러나 regionprops의 기능을 통해 나는이 지역의 지역을 알 수있다. 그리고 대부분의 나무는 3000 픽셀의 면적을 가지고 있고 연구 할 지역은 112,000 픽셀의 면적을 가지고 있기 때문에이 지역에는 약 37 그루의 나무가 있습니다. –

답변

4

이 질문을받은 지 얼마되지 않았습니다. 나는 대답 하기엔 너무 늦지 않기를 바란다. 비슷한 질문에 유역 분할을 사용하는 일반적인 문제가 있습니다. 때로는 물체가 서로 닿지 않고 떨어져있어 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) 

enter image description here

enter image description here

enter image description here

+0

SUPER! : D (15 자 분 제한) –

+0

이 제안은 분명히 나를 도울 것이며 지금까지 가지고있는 가장 가까운 근사치를 제공 할 것입니다. 대단히 감사합니다. –

1

당신은 마커 기반의 분수령을 시도해 볼 수도 여기 땅이없는 지역 (15)이다. 바닐라 유역 변환은 결코 내 경험상 상자 밖에서 작동하지 않습니다. 하나를 수행하는 한 가지 방법은 먼저 imdist()를 사용하여 세그먼트 화 된 영역의 거리 맵을 작성하는 것입니다. 그런 다음 imhmax()를 호출하여 로컬 최대 값을 억제 할 수 있습니다. 그런 다음 유역 호출()은 일반적으로 현저하게 잘 수행됩니다. 내가 ~ 10 분의 매개 변수와 함께 주변에 바이올린을하지만, 상당히 빈약 한 결과를 얻었다

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. 

:

segmented trees

당신이 필요할 것을 여기

그것을 수행하는 방법에 대한 샘플 스크립트입니다 이것에 일을 부어 라. 대부분 형태학을 통한 사전 및 사후 처리에 있습니다. 첫 번째 부분에서 세분화의 민감도를 낮출 수 있다면 곡률이 커질수록 세분화에 도움이됩니다. h-minima 변환의 크기도 중요한 관심사입니다. 이런 식으로 적절한 결과를 얻을 수 있습니다.

아마 더 나은 접근 방법은 클러스터링 기술의 세계에서 나온 것일 것입니다. 포리스트에있는 트리의 수를 추정 할 방법이 있거나 찾을 수있는 경우 전통적인 클러스터링 방법을 사용하여 트리를 구분할 수 있어야합니다. 가우스 혼합 모델이나 k-trees를 사용한 k-means는 아마도 거의 적당한 양의 나무를 얻는다면 마커 기반 유역보다 훨씬 잘 작동 할 것입니다. 일반적으로 나는 h-maxima 변환에서 억압 된 최대 값의 수를 기반으로 나무의 수를 추정 할 수 있습니다.하지만 레이블이 너무 소시지 일 수 있습니다. 그것은 시도 가치가있다.

+0

제안 해 주셔서 감사합니다. 해결하려고하면 여기에 게시 해 보겠습니다. –