2016-08-26 3 views
1

나는 이미지에서 세그먼트 화 된 2 차원 행렬을 나타내는 numpy 배열을 가지고있다. 기본적으로 이미지의 세그먼트 윤곽선 인 닫힌 모양을 가진 드문 드문 한 행렬입니다. 내가해야 할 일은 numpy에서 다른 색상/레이블을 가진 닫힌 모양의 빈 픽셀을 색칠하는 것입니다.numppy/python의 채우기 분할 이미지

필자는 PIL에서 floodfill로이 작업을 수행 할 수 있음을 알고 있지만 행렬을 numpy에서 PIL로 앞뒤로 변환하지 않으려 고합니다. skimage 나 sklearn과 같은 someting 함수가 있다면 그것은 내 매트릭스의 다른 닫힌 영역을 다른 레이블로 "자동 레이블링"할 수 있습니다 (단조 증가 정수 또는 색상 일 수 있음). 그 영역 내의 인접한 픽셀들의 정확한 그룹화를 나타내는 한 신경 써야한다).

나는 이미 내 자신의 floodfill을 구현하려고 많은 시간을 보냈으며이 시점에서 나는 이미지를 상자 밖으로 레이블링 할 수있는 somehting을 원했다.

답변

1

매트릭스가 바이너리이고 0이 아닌 값이 추출 된 세그먼트를 나타내고 0 값이 걱정하지 않는 값이라고 가정합니다. measure 모듈에서 scikit-imagelabel 함수 관심 수 http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.label

그것은 본질적으로 연결 컴포넌트 분석을 수행하고, 정수와 함께 모든 개별적 폐쇄 요소 라벨. 연결을 지정하는 방법과 관련하여주의해야합니다. 북쪽, 남쪽, 동쪽 및 서쪽 방향만을 사용하여 연결 지역을 찾는 경우 4 연결성 및 8 연결성이 있지만 8 연결성은 8 방향 (북쪽, 남쪽, 동쪽, 서쪽, 동북, 남동, 북서, 남서). connectivity 옵션을 사용하고 4 연결성의 경우 1을 지정하고 8 연결성의 경우 2을 지정하십시오.

그러나 기본 연결은 전체 연결이므로 2D의 경우 2 옵션이됩니다. 나는 네가이 방법이 될 것으로 의심한다. 0 인 행렬의 얼룩은 0으로 표시됩니다. 나는 왼쪽 상단과 오른쪽 하단에 생성 된 두 개의 섬이 있다는 것을

In [1]: from skimage.measure import label 

In [2]: import numpy as np 

In [3]: x = np.zeros((8,8)) 

In [4]: x[0:4,0:4] = 1 

In [5]: x[6:8,6:8] = 1 

In [6]: x 
Out[6]: 
array([[ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 1., 1., 1., 1., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1.], 
     [ 0., 0., 0., 0., 0., 0., 1., 1.]]) 

In [7]: label(x) 
Out[7]: 
array([[1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [1, 1, 1, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 2, 2], 
     [0, 0, 0, 0, 0, 0, 2, 2]], dtype=int64) 

우리는 볼 수 있습니다 : 속히, 여기 아주 간단한 재현 예입니다. label 함수를 실행하면 서로 속하는 픽셀 영역을 식별하는 레이블 행렬을 반환합니다. 동일한 ID를 가진 픽셀은 동일한 지역에 속한 픽셀을 의미합니다. 연결성이 활동하기 시작하는 방법

당신을 보여주기 위해 여기에 또 다른 간단한 예제 :

In [1]: import numpy as np 

In [2]: from skimage.measure import label 

In [3]: y = np.array([[0,1,0,0],[1,1,1,0],[0,1,0,1]]) 

In [4]: y 
Out[4]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 1]]) 

In [5]: label(y, connectivity=1) 
Out[5]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 2]], dtype=int64) 

In [6]: label(y) 
Out[6]: 
array([[0, 1, 0, 0], 
     [1, 1, 1, 0], 
     [0, 1, 0, 1]], dtype=int64) 

입력은 왼쪽 상단과 오른쪽 하단 모서리에 0이 아닌 별도의 값에 십자가 패턴을 가지고있다. 4 연결을 사용하면 오른쪽 하단 모서리가 다른 레이블로 분류되지만 기본 연결 (전체)을 사용하면 모든 픽셀이 동일한 레이블로 분류됩니다.