2015-01-12 5 views
3

안녕하세요 저는 깊이 이미지가 있습니다. 나는 그 사람 (인간) 실루엣을 추출하고 싶습니다. 다음과 같이 픽셀 임계 값을 사용했습니다 :깊이에서 실루엣 추출

for i=1:240 
    for j=1:320 
    if b(i,j)>2400 || b(i,j)<1900 
     c(i,j)=5000; 
    else 
     c(i,j)=b(i,j); 
    end 
    end 
end 

그러나 일부가 남아 있습니다. 그걸 제거 할 방법이 있습니까?

Original_image : enter image description here

Extracted_silhouette : enter image description here

+0

이것은 광범위한 주제 분야입니다. 그러나 아마도 누군가가 이것이 희망하는 것보다 더 어려운 이유를 설명하거나 유용한 다음 단계를 제공 할 수 있습니다. 답을 쓰는 사람이해야 할 일이 적기 때문에 픽셀 임계 값 코드를 보여주십시오. –

+0

@NeilSlater : 여기에 내 코드 'for i = 1 : 240 for j = 1 : 320 b (i, j)> 2400 || b (i, j) <1900 c (i, j) = 5000; else c (i, j) = b (i, j); end end end' –

+0

[this thread] (http://stackoverflow.com/q/27241945/1714410)가 유용 할 수 있습니다. – Shai

답변

4

this thread에 따르면 추정 된 표면 법선의 방향에 따라 깊이 맵 경계를 찾을 수 있습니다.

[dzx dzy] = gradient(depth_map); %// horizontal and vertical derivatives of depth map 
n = cat(3, dzx, dzy, ones(size(dzx))); 
n = bsxfun(@rdivide, n, sqrt(sum(n.^2, 3))); %// normalize to unit length 

간단한 방법은
enter image description here

과 파생 실루엣의보다 정교한 방법을 결과 임계 값

e = abs(n(:,:,3)) < 1e-2; 

하는 것입니다 수 있습니다, 표면 법선의 방향을 예측하려면 경계에서부터는 this answer에 있습니다.

+0

간단한 것이 있습니까? 앉아있는 사람의 가장자리를 추출하는 방법? –

+0

@FrqKhan 깊이 맵만 사용하여 사람과 소파를 구분할 수있는 간단한 방법은 없다고 생각합니다. 한번 생각해보십시오. 소파 영역에서 사람의 다리와 사람의 다리 사이의 깊이 정보가 다른 이유는 무엇입니까? 명확한 경계가없고 값의 차이가 없으며 표면 법선의 방향이 유익 할 수도 있지만 로컬에서만 가능합니다 ... – Shai

+0

ROI를 감지 할 수있는 방법이 있습니까? –

1

소파가 사람의 상체와 같은 깊이에 있기 때문에 이것은, 임계 값으로 할 어렵습니다. 전체 사람을 세분화해야합니까, 아니면 상체를 세분화하는 것으로 충분합니까? 후자의 경우에는 vision.CascadeObjectDetector을 사용하여 시도해 볼 수 있습니다. 컴퓨터 비전 시스템 도구 상자는 RGB 이미지에서 사람의 상체를 감지합니다.

+0

Hello Dima, 예 전 사람을 추출하고 싶습니다. 사람의 경계를 추출 할 수있는 방법이 있습니까? –

+0

Image Processing Toolbox에서 Image Segmenter 앱을 사용해보십시오. http://www.mathworks.com/help/images/image-segmentation-using-the-image-segmenter-app.html?refresh=true – Dima

0

@Shai above의 작업으로 제작하면 임계 값 출력을 가져 와서 THAT 이미지에 경계를 적용 할 수 있습니다. 아래는 이전 단계의 결과물에서 [YOUR_IMAGE]를 먹일 수있는 예제이며, 그 사람 만 선택 될 때까지 [ADJUST] 값을 수정합니다.

이 코드는 크기에 따라 경계를 찾고 있으며 입력 한 값보다 큰 값을 선택하지 않습니다. 간단히 말해서, 그것은 나를 위해 일합니다. 희망이 도움이됩니다.

boundaries = bwboundaries([YOUR_IMAGE]);  
numberOfBoundaries = size(boundaries) 
    if (size(boundaries) < [ADJUST]) 
     for k = 1 : numberOfBoundaries 
     thisBoundary = boundaries2{k} 
     plot(thisBoundary(:,2), thisBoundary(:,1), 'b', 'LineWidth', 2); 
     end 
    end 
+0

위의 코드에서 이미지 (e)는'bw 경계 (e)'를 계산하는 데 사용됩니다. 그러나 (경계)의 크기는'[16 1]'이라면 어떤 값을 선택해야합니까? '[ADJUST] = 18'을 입력하면 상자가 나타납니다. 맞습니까? –

+0

코드를 보면 해상도가 240x320 인 이미지가 있습니까? 그렇다면 조정할 값은 사람이 차지하는 픽셀 수를 반영해야합니다. 대략적인 견적에서 나는 그 사람이 이미지의 약 1/5을 점유한다고 말할 것입니다. 이것은 이미지에서 총 320x240 = 15360 픽셀을 제공하며, 그 중 15360은 사람의 픽셀 영역에 관한 것입니다. 이 번호로 작업하면 도움이됩니다. – Adam893

+0

사실 나는 위의 이미지의 ROI를 추출하고 이제는 사람과 그의 옆면에 소다의 일부만 있습니다. 이미지의 해상도가 이제 '211x111'이고 이미지의 1/5가 4684이므로 [ADJUST] = [70 60]을 사용했습니다. 이것은 나에게 [결과] (http://www.dropbox.com/s/pzf3ahwpvl8lerd/Capture.PNG?dl=0)를 보여줍니다. –