2012-08-29 2 views
3

이제 이미지 분할 맵 S가 있는데, 인덱스의 범위는 1에서 k 사이입니다. 동일한 번호의 색인은 동일한 세그먼트에 속합니다. 예를 들면 다음과 같습니다.matlab에서 영역 추출하기

S = [1 1 1 2 2 2; 
    1 1 1 2 2 2; 
    2 2 2 2 1 1; 
    2 2 2 2 1 1; 
    2 2 2 2 1 1] 

이 세분화 맵 S에 대해 영역을 가져 오려고합니다. 예를 들어, S에서 '1'은 두 개의 고립 된 부분을 가지고 있으므로 레이블 1과 레이블 2가있는 세 개의 영역을 얻고 싶습니다. 두 개의 '1'을 구별하려면 그 중 하나를 다음과 같이 변경하고 싶습니다. 다른 라벨 수, 3. 그래서 최종지도가 말한다 :

S = [1 1 1 2 2 2; 
    1 1 1 2 2 2; 
    2 2 2 2 3 3; 
    2 2 2 2 3 3; 
    2 2 2 2 3 3] 

나는이 문제를 해결하기 위해 연결된 구성 요소를 사용하여 생각하고 있지만, 그것은 친 화성 기질을 수립해야합니다. 그것을 할 수있는 더 좋은 방법이 있습니까?

+1

bwconncomp 또는 bwlabel을 사용하지 않는 이유는 무엇입니까? 이 문제에 특히 적합합니다 –

+1

그래서 두 번째 'S'행렬을 얻고 싶습니까? –

+0

@EitanT 예. 그리고 이제 문제가 해결되었습니다. 어쨌든 고마워! – luvegood

답변

2

모든 요소의 논리 행렬을 가져온 다음 bwlabel을 사용하여 연결된 모든 요소를 ​​가져옵니다. 함께 병합 할 수 있습니다. 두 영역을 혼합하는 문제점을 피하기 위해, 단지 예를 들어 원래 행렬의 최대 추가

mask   = (S == 1); 
labeled  = bwlabel (mask); 
labeled(mask) = labeled(mask) + max (S(:)) - 1; 
labeled   = S + labeled; 

유일한 차이점 전에 "1"의 값을 가지고 영역 하나도 없다는 것을 그 값 지금하지만 적어도 그들은 다른 레이블이 붙어 있습니다. 그들 중 하나가 번호를 유지하기를 원한다면, 가장 높은 값을위한 또 다른 마스크를 만드는 것일뿐입니다. 그리고 그것을 사용하여 다시 모든 마스크를 "1"로 만듭니다.

labeled(S == max(S(:))) = 1;