11장. Canny 와 Edge 비교
어떤 알고리즘을 고를까
여행 짐을 쌀 때 날씨부터 봅니다. 맑으면 가볍게, 비가 오면 우산을, 추우면 외투를 챙깁니다. 경계 검출도 그림의 형편(노이즈, 대비, 필요한 결과)을 먼저 보고 방법과 숫자를 고릅니다.
그림의 다섯 단계를 차례로 밟습니다. 노이즈가 얼마나 있는지 보고, 블러 크기를 정하고, 필요한 결과에 맞는 방법을 고르고, 기준값을 정한 뒤, 정답 경계가 있으면 점수로, 없으면 눈으로 확인합니다. 여기서 날씨가 그림의 형편, 챙기는 짐이 방법과 숫자입니다.
상황별로 고르기
| 상황 | 고르는 방법 | 까닭 |
|---|---|---|
| 물체의 테두리를 한 줄로 얻고 싶다 | Canny | 비최대 억제로 한 줄, 이력 임계값으로 끊김이 적다 |
| 경계의 세기나 방향 자체가 필요하다 | Sobel(임계값 없이) | 크기와 방향 값을 그대로 쓴다 |
| 사진이 흐린지(초점) 재고 싶다 | Laplacian 의 분산 | 10장에서 본 쓰임 |
| 노이즈가 많다 | 블러를 키우고, Canny 기준값을 올린다 | 프로젝트에서 확인한다 |
| 사진이 수백 장이다 | 자동 기준값을 쓰되 몇 장은 눈으로 확인 | 경험 규칙은 그림마다 맞지 않을 수 있다 |
| 다음에 윤곽선을 찾는다 | Canny 결과를 12장에 넘긴다 | 한 줄로 이어진 선이 윤곽선 찾기에 알맞다 |
짧은 예시
import cv2
# 그림의 노이즈를 대강 가늠해 블러 크기를 고르는 간단한 규칙(이 장에서 쓰는 경험 규칙)
gray = cv2.imread("ch11_set/shapes.png", cv2.IMREAD_GRAYSCALE)
# 원본과 3×3 Median 필터(7차시) 결과의 차이 평균: 노이즈가 많을수록 커진다
noise_level = float(cv2.absdiff(gray, cv2.medianBlur(gray, 3)).mean())
ksize = 3 if noise_level < 2 else (5 if noise_level < 6 else 7)
print("노이즈 가늠:", round(noise_level, 2), "→ 블러 크기", ksize)교안 PC 에서는 깨끗한 도형 그림이라 노이즈 가늠이 0.02 로 작아 블러 크기 3 이 나옵니다. 이 규칙의 2 와 6 은 이 장의 그림에 맞춰 정한 값이라, 다른 사진에서는 결과를 보며 고칩니다.
주의할 점
- 가장 좋은 방법은 그림마다 다릅니다. 정답 경계가 있는 몇 장으로 견줘 보고 고르는 것이 가장 확실합니다.
- 실제 사진에는 정답 경계가 없습니다. 몇 장만 사람이 테두리를 그어 정답을 만들거나, 결과를 격자로 놓고 눈으로 견줍니다.