2017-02-01 1 views
2

아래에 Matlab에 연속 된 셀 패치가 있습니다. enter image description here인접한 셀 패치의 외부 셀에서 다각형을 만드는 방법

빨간색 패치의 외부 셀을 결정해야하며이 셀의 중앙을 연결하는 다각형은 나에게 다각형을 제공합니다. 인접 패치의 외부 셀을 어떻게 계산합니까?

I은 ​​예를 들면 원소 빨간색 패치 셀을 나타내는 정수의 배열

a=[1;64;23;456;345]; 

각 요소를 갖고, (64)는 화상의 셀에 대응하는 말, 그것은 속하는 세포 인 빨간 패치.

문제를 해결하려는 동기는 너무 많은 셀이 아니라 가장자리 수가 최소 인 다각형을 처리하는 것입니다. 계산 속도가 느려집니다. 볼록 선체가 충분하지 않습니다. 그 결과 다각형이 갈색 영역과 전혀 겹치지 않게하고 싶습니다.

나는 아래 이미지의 왼쪽에있는 경우를 제안하지만 추한 것처럼 보입니다. 따라서 더 좋은 방법은 바깥 쪽 갈색 영역과 단일 지점 만 공유하는 셀을 건너 뛰기위한 것입니다. 내 바깥 쪽 세포가 바깥 쪽 갈색 영역과 단순한 점 이상을 공유하는 것입니다.

하지만 결과 폴리곤에서 많은 수의 가장자리를 피하려고합니다.

enter image description here

+1

유사한 (http://stackoverflow.com/a/33473452/2521214) 및 [결정 최소 : 이는 다음을 산출한다 미로를 해결하는 라인 세그먼트] (http://stackoverflow.com/a/30908390/2521214) – Spektre

+0

덕분에, 매우 도움이! –

답변

1

enter image description hereenter image description here

, 나는 영업 이익은 설명 된 규칙에 따라 가장자리의 집합을 추출하는 방법을 더 요구하고있다 생각합니다.

여기 가장자리를 포함하는 2x2 픽셀의 10 가지 패턴을 모두 식별하는 방법이 있습니다. 1들과 0의 (A = zeros(ny, nx); A(a) = 1)으로 이미지 매트릭스 A를 가정하면 : 여기

% we identify patterns with edges over 2x2 patches, describing with 
% the first 4 binary values what pixels are set, and with the next 2 
% the edge with 2 indices over the 2x2 patch 
patterns = [ 
0,1,0,1, 3,4 % vertical edge at rhe right 
1,0,1,0, 1,2 % vertical edge at the left 
0,0,1,1, 2,4 % horizontal edge at the bottom 
1,1,0,0, 1,3 % horizontal edge at the top 
1,0,0,1, 1,4 % diagonal edge 
0,1,1,0, 2,3 % diagonal edge 
1,0,1,1, 1,4 % diagonal edge, extra pixel set 
1,1,0,1, 1,4 % diagonal edge, extra pixel set 
1,1,1,0, 2,3 % diagonal edge, extra pixel set 
0,1,1,1, 2,3 % diagonal edge, extra pixel set 
]; 

% 2x2 patches (matrix form) 
P00 = A(1:end-1,1:end-1); 
P10 = A(2:end,1:end-1); 
P01 = A(1:end-1,2:end); 
P11 = A(2:end,2:end); 

% edge unique identifier using powers of 2 
id = @(p00,p01,p10,p11) 1*p00 + 2*p10 + 4*p01 + 8*p11; 
P = id(P00,P01,P10,P11); % vectorized pattern identification 

% edges 
e0 = []; % from (i,j) 
e1 = []; % to (i,j) 
for i = 1:size(patterns, 1) % small loop over the 10 patterns 
    p = patterns(i, :); 
    E = (P == id(p(1),p(2),p(3),p(4))); % pattern search, vectorized 
    [c,r] = ind2sub(size(E), find(E)); 
    [c0,r0] = ind2sub([2,2], p(5)); 
    [c1,r1] = ind2sub([2,2], p(6)); 
    e0 = [e0; c+c0, r+r0]; 
    e1 = [e1; c+c1, r+r1]; 
end 

그리고 이미지에 적용 결과는 (내가 캡처 김프를 사용, 그래서 어쩌면 이미지가 아닌, 크기 조정 및 필터)정확히 동일한 :

X = [e0(:,2) e1(:,2)]; 
Y = size(A,1) - [e0(:,1) e1(:,1)]; 
plot(X', Y', '.-') 

Resulting set of edges

내가 가정하고 그 가장자리 descri의 정렬 된 시퀀스를 얻기 앞에서 설명한 것처럼 폴리곤 (또는 폴리곤)을 배치하는 것이 주된 문제는 아닙니다.

+0

이것이 내가 찾던 해결책이다. 하지만 어떤 정점에서 시작하여 시계 방향 또는 시계 반대 방향으로 폴리곤의 꼭지점을 저장하는 nx2 행렬을 얻는 방법은 궁금합니다. –

+0

피곤하다 : -'X = X '; Y = Y '; new_poly = [X (1, ​​:) ', Y (1, :)']; line (new_poly (:, 1), new_poly (:, 2)); –

+0

2x2 패치와 2의 제곱과 관련된이 방법의 이름은 무엇입니까? 좀 더 자세히 이해할 수있는 정보원을 가르쳐 주시겠습니까? –

1

팽창의 결과와 원본 이미지 사이 and operator을 적용보다 당신은 이미지에 dilation을 적용 할 수 있습니다 이미지 처리 도구 상자를 사용하여. @ rahnema1에 의한 대답은 정말 멋진 있지만

A = imread('bnhfm.png'); 
B = A & imdilate(~A, true(3)); 
imshow(B); 
imwrite(B, 'result.png'); 
+0

아주 멋진 트릭! 적갈색 이미지를 어떻게 흑백으로 변환 했습니까? 그것을 programatically 통해 MATLAB 할 수 있습니까? –

+0

@ user_1_1_1 나는 그것을하기 위해 이미지 편집 소프트웨어를 사용했다. 그러나 나는 그것을 약간의 노력으로 matlab을 통해 할 수 있다고 생각한다. 그것은 새로운 질문을 받게 될 것입니다. – rahnema1

1

질문에서 샘플 이미지를 먼저 처리하여 논리 마스크를 만들었습니다 (이미 수행 방법에 대한 예제가 있습니다 here).

일단이 마스크를 사용하면 Image Processing Toolbox에서 bwtraceboundary 함수를 사용하여 원하는 다각형을 생성하는 정말 쉬운 방법이 있습니다.이것은 당신의 마스크 지역의 둘레 위해 당신에게 픽셀 인덱스의 집합을 제공합니다 :

[r, c] = find(mask, 1); 
coords = bwtraceboundary(mask, [r c], 'N'); 

그리고 우리는 지금처럼 시각화 할 수 있습니다 다음에 대한

imagesc(mask); 
colormap([0.9 0.9 0.9; 0.6 0.6 0.6]); 
axis equal 
set(gca, 'XLim', [0.5 0.5+size(mask, 2)], 'YLim', [0.5 0.5+size(mask, 1)]); 
hold on; 
plot(coords(:, 2), coords(:, 1), 'r', 'LineWidth', 2); 
plot(coords(1, 2), coords(1, 1), 'go', 'LineWidth', 2); 

enter image description here

좌표를 빨간색 선은 녹색 원에서 시작하여 마스킹 영역의 주변 픽셀 주위로 시계 방향으로 이동하도록 정렬됩니다.

당신이 주변 픽셀에 따라 다음과 경계 윤곽을 생성하는 것을 선호하는 경우

가장자리 지역 대신 주변 픽셀 센터, 당신이 related question- my answer에서 솔루션을 사용할 수 있습니다. 이 중

[동일한 사각형 형상으로 구성 개요에서 원주 다각형 추출]에서

enter image description here

관련 문제