12장. Contour Detection 과 객체 분석
윤곽선이란
색칠 공부 책의 그림은 검은 테두리 선으로 되어 있습니다. 아이는 테두리 하나를 손가락으로 한 바퀴 따라가며 "이건 사과 하나"라고 압니다. 그런데 같은 그림을 점묘화처럼 검은 점만 흩뿌려 그려 놓으면, 어느 점이 사과의 것이고 어느 점이 옆 귤의 것인지 따로 알기 어렵습니다. 윤곽선은 물체마다 테두리를 한 바퀴 따라가며 이은 선이고, 경계는 흩뿌린 검은 점에 가깝습니다.
초록 상자의 경계는 10장, 11장에서 만든 것으로, 밝기가 바뀌는 칸에 255 를 적은 그림입니다. 칸마다 "여기가 경계다"라는 표시만 있고, 그 칸이 어느 물체의 것인지는 적혀 있지 않습니다. 다홍 상자의 윤곽선은 물체 하나의 테두리를 따라 이은 점 목록이라 목록 하나가 곧 물체 하나입니다. 여기서 흩뿌린 검은 점이 경계이고, 손가락으로 한 바퀴 따라간 테두리가 윤곽선입니다.
같은 도형 판으로 둘을 견주었습니다. 가운데 Canny 경계는 모든 테두리가 똑같은 검은 칸이라 몇 개의 물체인지 그림만으로는 셀 수 없습니다. 오른쪽 윤곽선은 물체마다 따로 묶여 있어 색을 하나씩 다르게 칠할 수 있고, 목록의 길이로 개수를 바로 압니다. 도넛은 바깥 테두리만 그렸는데, 구멍의 테두리를 어떻게 다루는지는 "찾는 방식과 계층 구조" 절에서 봅니다.
경계와 윤곽선 견주기
| 견줄 것 | 경계(10·11차시) | 윤곽선(12차시) |
|---|---|---|
| 생김새 | 0 과 255 의 그림 한 장 | 점 좌표 배열의 목록 |
| 물체 구별 | 하지 않는다 | 목록 하나가 물체 하나 |
| 입력 | 흑백 사진 | 이진 그림(흰 물체, 검은 바탕) |
| 끊긴 곳 | 그대로 끊겨 있다 | 흰 덩어리를 따라가므로 늘 닫혀 있다 |
| 할 수 있는 일 | 테두리 보기, 다음 단계의 재료 | 개수, 면적, 둘레, 위치, 상자 |
짧은 예시
import cv2
# 가상의 도형 판(흰 도형, 검은 바탕)을 흑백으로 읽는다
shapes = cv2.imread("ch12_shapes.png", cv2.IMREAD_GRAYSCALE)
# 경계: 칸의 모음이라 칸 수만 셀 수 있다
edges = cv2.Canny(shapes, 50, 150)
print("경계 칸 수:", int((edges > 0).sum()))
# 윤곽선: 물체마다 점 목록 하나. 목록의 길이가 곧 덩어리 수다
contours, hierarchy = cv2.findContours(shapes, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("윤곽선 수:", len(contours))교안 PC 에서는 경계 칸이 1,580개, 윤곽선이 8개입니다. 도형 6개와 작은 점 2개가 따로 잡혔습니다. 경계 칸 수로는 물체가 몇 개인지 알 수 없지만, 윤곽선의 수는 바로 흰 덩어리의 수입니다.