OpenCV 비전 실무11장 · Canny 와 Edge 비교12 / 21← 이전목차다음 →MetaContents

11장. Canny 와 Edge 비교

어떤 알고리즘을 고를까

여행 짐을 쌀 때 날씨부터 봅니다. 맑으면 가볍게, 비가 오면 우산을, 추우면 외투를 챙깁니다. 경계 검출도 그림의 형편(노이즈, 대비, 필요한 결과)을 먼저 보고 방법과 숫자를 고릅니다.

노이즈 보기, 블러 정하기, 방법 고르기, 기준값 정하기, 점수 확인의 다섯 단계 흐름도

그림의 다섯 단계를 차례로 밟습니다. 노이즈가 얼마나 있는지 보고, 블러 크기를 정하고, 필요한 결과에 맞는 방법을 고르고, 기준값을 정한 뒤, 정답 경계가 있으면 점수로, 없으면 눈으로 확인합니다. 여기서 날씨가 그림의 형편, 챙기는 짐이 방법과 숫자입니다.

상황별로 고르기

상황고르는 방법까닭
물체의 테두리를 한 줄로 얻고 싶다Canny비최대 억제로 한 줄, 이력 임계값으로 끊김이 적다
경계의 세기나 방향 자체가 필요하다Sobel(임계값 없이)크기와 방향 값을 그대로 쓴다
사진이 흐린지(초점) 재고 싶다Laplacian 의 분산10장에서 본 쓰임
노이즈가 많다블러를 키우고, Canny 기준값을 올린다프로젝트에서 확인한다
사진이 수백 장이다자동 기준값을 쓰되 몇 장은 눈으로 확인경험 규칙은 그림마다 맞지 않을 수 있다
다음에 윤곽선을 찾는다Canny 결과를 12장에 넘긴다한 줄로 이어진 선이 윤곽선 찾기에 알맞다

짧은 예시

Python
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 은 이 장의 그림에 맞춰 정한 값이라, 다른 사진에서는 결과를 보며 고칩니다.

주의할 점

  • 가장 좋은 방법은 그림마다 다릅니다. 정답 경계가 있는 몇 장으로 견줘 보고 고르는 것이 가장 확실합니다.
  • 실제 사진에는 정답 경계가 없습니다. 몇 장만 사람이 테두리를 그어 정답을 만들거나, 결과를 격자로 놓고 눈으로 견줍니다.
← 이전 절11장 · 성능을 숫자로 재기다음 절 →11장 · 실습 지도