scikit-image 세그멘테이션

scikit-image 세그멘테이션

세그멘테이션(segmentation)은 이미지를 의미 있는 영역으로 나누는 작업이에요. 전경과 배경을 구분하거나, 물체 단위로 영역을 나누는 데 쓰여요. scikit-image는 간단한 임계값부터 슈퍼픽셀·워터쉐드 같은 방법까지 제공해요.

출처: https://scikit-image.org/docs/stable/user_guide/segmentation.html

마커 기반 워터쉐드

watershed()는 이미지의 지역 최소값을 마커로 삼아 영역을 채워 나가는 방법이에요. 객체가 많은 이미지에서 각 객체를 분리할 때 유용해요.

from skimage import segmentation

labels = segmentation.watershed(image, markers)

결과인 labels 배열은 각 픽셀이 어느 영역에 속하는지를 나타내는 정수 라벨이에요.

슈퍼픽셀

felzenszwalb()slic()는 비슷한 픽셀들을 묶어 슈퍼픽셀(superpixel)로 만드는 방법이에요. SLIC은 색과 위치가 비슷한 픽셀을 지역적으로 군집화해요.

from skimage.segmentation import slic

segments = slic(image, n_segments=100)

대비 강조 후 세그멘테이션

세그멘테이션 품질은 전처리에 크게 좌우돼요. 히스토그램 균등화(equalize_hist)로 대비를 강조하거나 노이즈를 제거한 뒤 세그멘테이션하면 결과가 훨씬 좋아져요.

from skimage import exposure

enhanced = exposure.equalize_hist(image)

라벨과 영역 속성

라벨 이미지는 skimage.measureregionprops()로 각 영역의 면적, 둘레, 중심 같은 속성을 뽑아낼 수 있어요.

from skimage import measure

props = measure.regionprops(labels, intensity_image=image)

더 알아보기