2014-11-11 3 views
0

나는 이미지 A와 행렬 A의 경계 상자 위치 집합을 가지고, A = [x10 y10 x11 y11; x20 y20 x21 y21 ... xn0 yn0 xn1 yn1]. 이 상자는 아래 그림과 같이 시각화 할 수 있습니다.이미지에서 matlab 집합 경계 상자 영역

    imshow(I); 
        numparts = floor(size(A, 2)/4); 
        for i = 1:numparts 
        x1 = A(1,1+(i-1)*4); 
        y1 = A(1,2+(i-1)*4); 
        x2 = A(1,3+(i-1)*4); 
        y2 = A(1,4+(i-1)*4); 
        line([x1 x1 x2 x2 x1]',[y1 y2 y2 y1 y1]','color',colorset{i},'linewidth',2); 
        end 

이러한 경계 상자 영역을 어떻게 합계하여 해당 상자의 픽셀을 1로 레이블링 할 수 있습니까? 그렇지 않으면 0으로 레이블을 지정합니까? A에 모든 테두리 상자가 포함 된 모든 항목을 포함하는 테두리 상자가 필요하지 않습니다. 테두리 상자를 집계하는보다 정확한 영역지도가 필요합니다. enter image description here

답변

1

올바르게 이해하면 바깥 쪽을 찾고 싶습니다. 경계 상자의 둘레를 함께 배치 한 다음 도형의 전체 내부를 모두 1로 설정합니다. 또한 배열이 각 행에 대해 첫 번째 두 좌표가 맨 위가되도록 구조화되어 있다고 가정합니다. 다음 두 좌표는 특정 경계 상자의 오른쪽 하단 모서리입니다.

이진 이미지를 만들고이 이진 이미지에 바운딩 상자를 각각 채우십시오. 을 그립니다.


final_mask

%// Declare mask 
mask = false(size(I,1), size(I,2)); 

%// Go through each bounding box pair of co-ordinates and draw a bounding box 
%// inside the mask 
%// Directly using your code... though you can do this more efficiently 
numparts = floor(size(A, 2)/4); 
for i = 1:numparts 
    x1 = floor(A(1,1+(i-1)*4)); 
    y1 = floor(A(1,2+(i-1)*4)); 
    x2 = floor(A(1,3+(i-1)*4)); 
    y2 = floor(A(1,4+(i-1)*4)); 

    %// Draw bounding box here 
    mask(y1:y2,x1:x2) = true; 
end 

%// Show the original image as well as the mask beside it 
figure; 
subplot(1,2,1); 
imshow(I); 
subplot(1,2,2); 
imshow(final_mask); 
지금 당신이 찾고있는 무엇을 포함해야한다 : 당신은 다음 함께 1 등으로 전체 내부 세트 경계 상자를 모두 포함하는 형태를 얻을 것 같은 뭔가. 여기에서 취하는 가정은 x은 가로이고 y은 세로입니다. 그렇지 않은 경우에는 for 루프의 마지막 문에서 첫 번째 및 두 번째 차원 인덱싱을 사용자 목적에 맞게 간단히 바꿉니다.

(x,y)floor 좌표를 부동 소수점 또는 정수로 사용할지 여부가 확실하지 않기 때문에 특히주의해야합니다. 내가 한 것을 사용할 수 있으려면, 내가하려고하는 마스크에 인덱스 할 수 있도록 좌표가 정수인지 확인해야합니다.

또한이 코드는 오류 검사를 제공하지 않습니다. 테두리 상자 중 하나가 이미지 경계 바깥으로 이동하면 MATLAB은이 사실을 알리는 오류를 생성합니다. 이미지 경계 바깥에있는 마스크에서 테두리 상자를 그리는 데 추가적인 오류 검사를 수행하도록 남겨 두겠습니다. 걱정할 필요가 없다면이 단계를 코딩 할 필요가 없습니다.

원본 이미지와 그 옆에있는 집계 마스크를 하나의 창에 표시하는 코드도 작성했습니다.

행운을 빈다.