워터셰드(Watershed)란? AI에서 시작점과 지형을 따라 이미지의 영역을 나누는 방법
TL;DR
워터셰드(Watershed)는 영상의 값을 지형의 높이처럼 보고 시작점에서 영역을 넓혀 픽셀마다 소속 번호를 정하는 분할 방법입니다. 물에 잠기는 골짜기와 물이 만나는 경계를 떠올리면 쉽습니다. 붙어 있는 대상 후보를 나누거나 경계 정보를 따라 구역을 만들 때 씁니다. 결과는 거리값이나 정답 확률이 아닌 영역 번호이며 시작점·지형·허용 범위에 따라 달라집니다. 라이브러리마다 입력과 경계 표시가 다르므로 번호 지도를 그대로 바꿔 쓰지 않습니다.
핵심 3줄 요약
- 핵심 1
시작점이 영역의 출발점입니다. 서로 다른 번호의 마커에서 영역을 넓힙니다. 시작점이 빠지거나 과하면 대상이 합쳐지거나 쪼개질 수 있습니다. - 핵심 2
지형과 처리 범위를 따로 정합니다. 기울기나 음의 거리 지도를 지형으로 쓰고 마스크로 허용 영역을 제한하는 방식을 구분합니다. - 핵심 3
번호와 경계값의 뜻을 확인합니다. OpenCV의 경계와 scikit-image의 선택적 경계는 값이 다릅니다. 보기 좋은 색칠이 정확한 물체 분리를 뜻하지 않습니다.
이 글에서 다룰 내용
- 워터셰드의 한 문장 정의
- 다섯 칸짜리 지형으로 이해하는 마커와 영역
- AI 영상 후처리에서 쓰는 이유와 영역 확장 순서
- scikit-image·OpenCV의 입력과 경계값
- 거리 변환·CCL·이미지 분할과의 차이
- 붙은 대상 분리와 실전 체크리스트
- 시작점 오류·과분할·마스크·자료형의 주의점
워터셰드를 한 문장으로 정의하면 무엇인가요?
워터셰드는 픽셀 값을 높이로 해석한 지형에서 골짜기 또는 지정한 마커를 출발점으로 영역을 확장해, 픽셀을 서로 다른 분지에 할당하는 영상 분할 방법입니다.
영문명은 Watershed이며 분수령 변환, 워터쉐드라고도 부릅니다. 이 글은 시작점에 번호를 주는 마커 기반 방식을 중심으로 설명합니다. 마커는 한 점일 수도 있고 여러 픽셀로 된 작은 구역일 수도 있습니다. 같은 번호는 같은 영역의 출발점을 뜻하며 제품 이름이나 의미 클래스가 자동으로 붙지는 않습니다.
scikit-image 공식 워터셰드 예제는 마커에서 물을 채워 서로 다른 분지가 만나는 관계로 원리를 설명합니다. 실제 프로그램은 물을 흘리는 대신 픽셀의 값과 이웃 관계로 처리 순서를 계산합니다. 구현과 옵션에 따라 경계를 따로 남기기도 하고 맞닿은 두 영역에 픽셀을 나눠 주기도 합니다.
한 줄 정리: 워터셰드는 출발점과 지형을 보고 영역 번호를 퍼뜨립니다. 물체의 이름을 알아보는 학습 모델과는 역할이 다릅니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 왼쪽과 오른쪽이 낮고 가운데가 높은 다섯 칸짜리 지형을 본다고 가정해 보겠습니다. 높이는
[0,1,3,1,0]
이고 마커는
[1,0,0,0,2]
입니다. 마커의 1과 2는 두 출발 영역이며 0은 아직 번호가 정해지지 않은 칸입니다. 마커값과 높이는 서로 다른 배열입니다.
상하 없이 좌우 이웃만 보는 설명용 확장에서 왼쪽은 1번, 오른쪽은 2번으로 넓어집니다. 가운데처럼 조건이 같은 칸은 동점 규칙이 필요합니다. 이 글의 작은 계산은 먼저 대기열에 들어간 쪽을 우선하고 왼쪽 마커부터 넣어
[1,1,1,2,2]
를 얻었습니다. 가운데 픽셀에 경계 전용 번호를 따로 남기지 않는 예시입니다.
같은 지형에서 오른쪽 마커를 없애고 왼쪽에만 1을 두면 다섯 칸 모두 1번이 됩니다. 높은 곳이 있다는 이유만으로 반드시 두 물체로 갈라지지는 않습니다. 가운데 칸을 허용 마스크에서 제외하면
[1,1,0,2,2]
처럼 그 칸을 처리하지 않습니다. 여기의 0은 제외된 위치입니다.
이 배열들은 Python 표준 라이브러리로 만든 1차원 우선순위 확장 예제에서 확인했습니다. scikit-image나 OpenCV의 워터셰드 함수를 실행한 결과가 아니며 실제 물체 분리 성능을 뜻하지 않습니다. 배열 바깥은 이웃으로 넣지 않았고 동점 처리와 경계선 옵션이 다른 구현의 출력까지 같다고 보장하지 않습니다.
쉬운 예시: 같은 지형도 출발점이 하나인지 둘인지에 따라 번호 지도가 바뀝니다. 먼저 마커를 원본 위에 올려 보고 무엇을 별도 대상으로 나눌지 확인합니다.
왜 AI에서 워터셰드가 중요한가요?
붙은 대상 후보를 별도 영역으로 나눕니다
전경 마스크에서 두 대상이 닿아 있으면 하나의 덩어리로 남을 수 있습니다. 각 대상 안에 다른 마커를 두고 알맞은 지형을 쓰면 붙은 부분을 나누는 후처리를 검토합니다. 다만 원본에서 경계 단서가 약하거나 마커가 잘못 놓이면 나눔도 틀립니다. 자동 분리라는 이름만으로 개수를 확정하지 않습니다.
모델의 예측과 후처리의 결정을 구분합니다
분할 모델이 만든 대상 마스크에 워터셰드를 추가할 때는 원본 예측과 마커 생성, 영역 확장을 따로 저장합니다. 모델의 누락과 마커 선택 규칙의 오류를 구별하기 쉽습니다. 워터셰드 자체가 이 단계에서 정답 자료로 신경망의 가중치를 다시 학습하는 것은 아닙니다.
핵심 인사이트: 영역이 더 많이 생겼다는 사실보다 실제 개별 대상과 대응하는지가 중요합니다. 합쳐진 오류와 과하게 쪼갠 오류를 나눠 평가합니다.
워터셰드는 어떤 순서로 작동하나요?
1. 영역을 넓힐 지형을 준비합니다
경계를 강조한 기울기 영상을 쓰면 값이 높은 부분이 영역 확장을 가르는 단서가 됩니다. 공식 Markers for watershed 예제는 기울기가 낮은 구역에서 마커를 만들고 별도의 기울기 영상을 지형으로 사용합니다. 워터셰드가 항상 거리 변환을 먼저 해야 하는 것은 아닙니다.
둥근 대상이 겹친 예제에서는 배경에서 먼 위치를 시작점 후보로 삼습니다. 거리 지도는 안쪽이 높으므로 부호를 바꾼
-distance
를 쓰면 안쪽이 낮은 골짜기가 됩니다. 원본 사진, 거리 지도와 음의 거리 지형을 같은 자료로 혼동하지 않습니다.
2. 구별할 시작점과 허용 범위를 정합니다
나누려는 영역마다 서로 다른 마커 번호를 둡니다. 아직 결정하지 않은 위치는 0으로 남깁니다. 사람이 지정하거나 별도 규칙으로 자동 생성할 수 있습니다. 대상 하나에 여러 마커가 흩어지면 과분할이 생길 수 있으므로 점 개수만 보지 말고 번호와 위치를 함께 확인합니다.
허용 마스크를 받는 API에서는 처리할 위치도 따로 제한합니다. 마커가 없는 0과 마스크에서 제외한 위치는 역할이 다릅니다. 배경까지 영역 확장에 참여시키는 방식이라면 배경에도 별도 마커가 필요할 수 있습니다. 사용하는 함수의 입력 계약을 먼저 읽습니다.
3. 이웃과 처리 우선순위에 따라 번호를 확장합니다
scikit-image 문서는 픽셀 값과 대기열 진입 순서로 우선순위를 정한다고 설명합니다. 낮은 지형부터 처리하면서 아직 정해지지 않은 이웃에 마커의 소속을 확장합니다. 평평한 곳에서는 동점 규칙도 결과에 관여하므로 숫자가 큰 마커가 이긴다고 해석하지 않습니다.
4. 결과 번호와 경계를 원본에 겹칩니다
최종 번호 지도에서 같은 값의 위치들을 모아 영역을 확인합니다. 번호는 확률 점수나 실제 크기 순서가 아닙니다. 경계 전용 값과 배경을 제외하고 대상 후보를 셉니다. 원본의 붙은 부분, 가는 돌출부와 작은 대상에서 잘못 갈라지거나 합쳐진 곳을 따로 기록합니다.
실전 팁: 원본·지형·마커·허용 마스크·최종 정수 지도를 함께 보관하세요. 표시용 색깔만 저장하면 어떤 출발점이 결과를 만들었는지 추적하기 어렵습니다.
주요 설정과 결과는 어떻게 읽나요?
scikit-image의 마커·마스크·연결을 구분합니다
공식 watershed API는 값이 낮은 위치를 먼저 처리하는 수치 지형을 받습니다. 마커 배열의 0은 시작점이 아니라는 뜻입니다.
markers=None
이면 지형의 국소 최솟값에서 기본 마커를 구하며 문서는 명시적인 마커 전달을 권합니다. 배경 0을 고정한 마스크처럼 생각하면 안 됩니다.
mask
는 참인 위치만 번호를 붙이는 허용 범위입니다. 2차원에서
connectivity=1
은 상하좌우,
connectivity=2
는 대각선을 포함한 이웃을 뜻합니다. 기본값은 1입니다.
compactness
를 높이면 더 규칙적인 형태의 분지를 유도하지만 실제 물체의 경계를 더 정확히 찾는다는 보장은 없습니다.
경계선을 남길지 선택합니다
scikit-image의 기본
watershed_line=False
는 분리선용 픽셀을 따로 남기지 않습니다.
watershed_line=True
이면 영역 사이에 한 픽셀 폭의 0 레이블 선을 만듭니다. 문서는 마커 영역이 이미 맞닿아 있으면 그 사이의 경계가 이 방식으로 잡히지 않을 수 있다고 주의합니다.
결과의 0을 모두 같은 뜻으로 읽지 않습니다. 허용 마스크 밖의 위치와 선택한 분리선이 둘 다 0으로 보일 수 있으므로 원래 마스크와 옵션을 같이 봅니다. 경계 픽셀을 제외하고 면적을 셀지 영역에 배분할지도 측정 규칙에 적습니다.
OpenCV는 입력 자료형과 경계값이 다릅니다
OpenCV 공식 watershed API는 8비트 3채널 영상과 같은 크기의 32비트 부호 있는 단일 채널 마커 지도를 받습니다. 양의 정수는 정해진 출발 영역, 0은 미정 위치입니다. 마커 지도는 입력이면서 결과 저장 공간이므로 호출 전 복사본도 남깁니다.
결과 경계는
-1
로 표시됩니다. OpenCV 동전 분할 예제는 배경을 양의 번호로 바꾸고 미정 구역만 0으로 설정합니다. CCL에서 배경이 0이었다는 이유로 그대로 넘기면 역할이 달라집니다. OpenCV 역시 처음부터 맞닿은 마커가 항상 경계 픽셀로 분리된다고 보장하지 않습니다.
워터셰드와 헷갈리는 용어는 무엇이 다른가요?
거리 변환·연결 성분 레이블링과의 차이
거리 변환은 픽셀에서 배경까지의 거리값을 구합니다. 워터셰드는 주어진 지형과 마커로 영역 번호를 정합니다. 연결 성분 레이블링(CCL)은 연결된 덩어리에 번호를 붙이므로 붙은 두 대상을 원래 마스크 그대로는 하나로 묶을 수 있습니다. CCL을 마커 생성에 쓰는 것과 최종 영역을 나누는 것은 별도 단계입니다.
이미지 분할·인스턴스 분할과의 차이
이미지 분할은 픽셀을 영역이나 대상에 할당하는 넓은 과제입니다. 워터셰드는 그 과제를 다루는 특정 방법입니다. 번호별 영역이 생겨도 실제 개별 대상과 일치해야 인스턴스 구분에 도움이 됩니다. 클래스 이름, 가려진 부분과 시간에 걸친 추적 ID까지 자동으로 복원하지 않습니다.
비교 정리: 거리 지도는 수치 자료, CCL은 연결 덩어리의 식별, 워터셰드는 마커와 지형에 따른 영역 분할입니다. 세 단계는 함께 쓰일 수 있지만 결과의 뜻은 다릅니다.
실전에서는 어디에 쓰이나요?
서로 닿은 둥근 대상의 분리 후보를 만듭니다
공식 예제의 겹친 원이나 맞닿은 동전처럼 개별 시작점을 고를 단서가 있을 때 사용합니다. 이진화 뒤에도 하나로 붙은 영역을 나누는 후보 처리입니다. 동전 예제 자체에도 잘 분리되지 않은 부분이 있으므로 같은 설정을 모든 촬영 환경의 정답으로 옮기지 않습니다.
경계 정보를 따라 검토 구역을 나눕니다
기울기 영상과 낮은 변화 구역의 마커를 이용해 이미지를 여러 검토 영역으로 나누는 방식도 있습니다. 영역별 색·질감·면적을 다음 분석에 넘길 수 있지만 명암 경계가 실제 사물 경계와 다른 사진에서는 결과도 어긋납니다. 분할 결과와 최종 업무 판정을 분리합니다.
워터셰드를 적용할 때 어떤 순서로 확인하나요?
1. 입력 네 가지를 따로 표시합니다
원본, 지형, 마커와 허용 범위를 나란히 확인합니다. 각 마커가 어떤 대상 후보를 뜻하는지 적고 전경·배경·미정을 구별합니다. 라이브러리 버전, 크기와 좌표를 고정하고 같은 번호를 여러 위치에 두는 이유도 남깁니다.
2. 작은 경계 사례와 출력 계약을 시험합니다
마커 하나, 서로 다른 마커 둘, 너무 많은 마커, 평평한 지형과 맞닿은 마커를 시험합니다. 마스크가 끊긴 구역과 시작점이 없는 구역도 봅니다. 경계값과 배경을 확인하고 부호 없는 이미지 형식으로 저장하면서 음의 경계값을 잃지 않는지 검사합니다.
3. 합침·쪼개짐과 비용을 함께 기록합니다
지형은 고정하고 마커만 바꾸는 비교, 마커는 고정하고 지형만 바꾸는 비교를 나눕니다. 실제 대상별 정답에서 합침·쪼개짐·누락·경계 오류를 확인합니다. 설정 선택 자료와 최종 평가 자료를 분리하고 원래 해상도에서 처리 시간과 메모리도 측정합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 과분할과 시작점 누락을 따로 봅니다. 잡음 때문에 마커가 너무 많이 생기면 한 대상이 여러 구역으로 나뉩니다. 반대로 둘을 나눌 마커가 부족하면 높은 경계 단서가 있어도 합쳐질 수 있습니다. 원본에서 마커가 타당한지부터 검토합니다.
둘째, 지형의 방향을 확인합니다. 거리의 높은 곳을 그대로 낮은 골짜기처럼 설명하지 않습니다. 음의 거리와 기울기 지형은 값의 의미가 다릅니다. 색상을 뒤집어 표시한 그림과 실제 배열의 부호를 바꾼 처리도 구분합니다.
셋째, 0과 음수의 역할을 고정합니다. 미정 마커, 제외 위치, 배경 마커와 경계 전용 값을 문서에 적습니다. OpenCV의 음의 경계값을 전경으로 세거나 scikit-image의 0을 무조건 배경 정답으로 읽지 않습니다.
넷째, 경계가 자연스럽다는 이유만으로 확정하지 않습니다. 조명·해상도·잘라낸 범위가 바뀌면 지형과 마커도 달라집니다. 색칠 결과와 실제 대상을 대조하고 개수가 같더라도 서로 다른 합침·쪼개짐 오류가 상쇄되지 않았는지 봅니다.
주의: 워터셰드의 영역 번호는 정한 입력 조건에서 계산한 분할 결과입니다. 실제 물체 수, 의미 클래스와 측정 정확성을 보증하지 않습니다. 중요한 판정에는 정답 대조와 사람 검토를 별도로 둡니다.
자주 묻는 질문
Q1. 워터셰드는 딥러닝 모델인가요?
이 글의 마커 기반 워터셰드는 지형과 시작점으로 영역을 계산하는 고전 영상 처리 방법입니다. 딥러닝의 예측 뒤에 붙일 수 있지만 이 단계에서 물체의 의미를 새로 학습하지는 않습니다.
Q2. 거리 변환이 반드시 필요한가요?
아닙니다. 겹친 원 예제는 음의 거리 지형을 쓰지만 기울기 영상을 쓰는 공식 예제도 있습니다. 어떤 값이 대상 내부와 경계를 구별하는지에 따라 지형을 선택합니다.
Q3. 시작점을 많이 두면 더 정확한가요?
그렇지 않습니다. 한 물체에 다른 번호의 시작점이 여러 개 있으면 과하게 쪼갤 수 있습니다. 마커 수뿐 아니라 위치와 번호, 실제 대상과의 대응을 함께 확인합니다.
Q4. 경계는 언제나 -1인가요?
OpenCV는 경계에 -1을 씁니다. scikit-image는 기본적으로 분리선용 픽셀을 남기지 않고 선택 옵션을 켜면 0인 선을 만듭니다. 맞닿은 초기 마커의 경계 제약도 각 문서에서 확인합니다.
Q5. 번호가 붙으면 실제 물체 개수도 확정되나요?
아닙니다. 배경 마커와 분리선, 누락과 과분할을 구분해야 합니다. 번호 크기는 신뢰도나 물체 크기가 아니며 다음 영상에서 같은 대상에 같은 번호가 붙는다는 약속도 없습니다.
출처
마무리
워터셰드는 시작점과 지형에 따라 픽셀을 영역에 배정하는 분할 방법입니다. 지형의 값, 마커의 번호와 허용 범위를 나눠 읽고 라이브러리별 경계 표시를 확인하면 거리 계산이나 단순 연결 번호와의 차이가 분명해집니다.
처음 적용한다면 작은 입력에서 마커 하나와 둘의 차이부터 확인하세요. 원본 위에 출발점과 최종 경계를 겹친 뒤 합쳐진 곳과 과하게 나뉜 곳을 검토합니다. 실전 점검은 입력 조건과 실제 대상의 대응을 기록하는 데서 시작합니다.
