1. 엣지 검출이란?

- 정의: 화소 강도(intensity)의 급격한 변화(discontinuity)를 검출하는 과정.
- 목적: 물체의 윤곽이나 구조를 파악하여 이후 컨투어 추출, 객체 분할 등에 활용.
- 문제점: 단순 그라디언트만으로는 내부 잡음(noise)까지 엣지로 검출되어 원하는 외곽선만 추출하기 어려움
2. 이미지 내 에지(edge)의 종류
| 엣지종류 | 그래프 | 설명 |
| Step edge | ![]() |
픽셀 값이 순간적으로 변하는 계단 모양 변화 |
| Ramp edge | ![]() |
계단이 완만하게 기울어진 형태 짧은 거리에 걸쳐 값이 점진적으로 변화 |
| Ridge edge | ![]() |
두 개의 Ramp Edge가 맞닿아 오르막-평지-내리막 형태 |
| Roof edge | ![]() |
Ridge에서 꼭대기 부분이 평탄하지 않고 뾰족한 형태 |
3. Canny Edge Detection 4단계
# 1) 영상 로드 및 전처리
image = cv2.imread("path/to/image.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0) # Step1
# 2) Canny 엣지 검출: (입력, lower_thresh, upper_thresh) # Step 2, 3, 4
edges_wide = cv2.Canny(blurred, 10, 200)
edges_mid = cv2.Canny(blurred, 30, 150)
edges_tight = cv2.Canny(blurred, 240, 250)
# 3) 결과 표시
cv2.imshow("Wide Edges", edges_wide)
cv2.imshow("Mid Edges", edges_mid)
cv2.imshow("Tight Edges", edges_tight)
cv2.waitKey(0)
Step #1: Gaussian smoothing
- 작은 세부정보(노이즈)를 무시하고 주요 구조만 남기기 위해 가우시안 블러 처리
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
Step #2: Gradient magnitude & orientation
- Sobel 커널로 수평·수직 변화량을 구한 뒤 image gradient(에지의 “강도”와 “방향”) 정보 추출
Step #3: Non-maxima suppression
- 에지 픽셀을 단 1픽셀 폭으로 얇게 만드는 과정
- 방법: 각 픽셀에서 gradient 방향의 이웃 픽셀 2개를 비교하여 지역 최대값만 보존하고 나머지는 0으로 설정
- 예시
![]() |
그라디언트 방향이 90도일때(초록 화살표,북쪽) 픽셀값(93)과 인접한 두 픽셀 :북쪽(162), 남쪽(26)의 크기를 비교 ▷ 162이 최대치이므로 93 → 0으로 값 변경 |
![]() |
그라디언트 방향이 180도일때(초록 화살표,서쪽) 픽셀값(93)과 인접한 두 픽셀 :서쪽(104), 동쪽(139)의 크기를 비교 ▷ 139가 최대치이므로 93 → 0으로 값 변경 |
Step #4: Hysteresis thresholding
- 두개의 임계값(T upper, T lower)을 사용하여 진짜 엣지만 선별
- 따라서 임곗값을 튜닝하는것이 매우 중요함
- 방법:
- → 강한 엣지
- T lower < G < T upper → 강한 에지와 연결 시에만 유지, 아니면 버림
- G < T lower → 엣지아님(제거)
- 시각화:
- A > T upper : 강한엣지
- B : 임곗값들 중간, but 강한엣지인 A와 연결됨 : 엣지
- C : 임곗값들 중간, 강한엣지와 연결 안됨 : 버림
- D < T lower : 버림

4. Auto Canny Edge Detection
- Canny에서 T upper, T lower 두개의 임곗값을 자동으로 구하기 위함
- 넓은 임계값의 과다 검출과 타이트 임계값의 과소 검출을 모두 보완하며, 균형 잡힌 엣지 맵을 제공
- 방법 : 픽셀 강도의 중앙값(median)을 계산
→ 이 중앙값을 기준으로 ±σ(%) 만큼 범위를 설정(기본 제안 sigma 값은 0.33)
→ 이 임계값들을 그대로 cv2.Canny에 전달 → 자동 임계값 완성
def auto_canny(image, sigma=0.33):
# 1) 영상 중앙값 계산
v = np.median(image)
# 2) ±sigma 비율로 하·상 임계값 설정
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
# 3) Canny 적용
edged = cv2.Canny(image, lower, upper)
return edged


| 방법 | 설정값 예시 | 특징 |
| Wide | (10, 200) | 물체와 고주파 노이즈(구름·반사 등)까지 과다 검출 |
| Tight | (224, 250) | 노이즈 제거는 잘 되지만, 물체 일부(꼬리·디테일 등) 누락 |
| Automatic | auto_canny(sigma=0.33) | 노이즈는 걸러내고, 주요 구조(물고기·카메라·컵 등)를 충실히 검출 |
출처
OpenCV Edge Detection ( cv2.Canny ) - PyImageSearch
In this tutorial, you will learn how to perform edge detection using OpenCV and the Canny edge detector.
pyimagesearch.com
Zero-parameter, automatic Canny edge detection with Python and OpenCV - PyImageSearch
Don't tune your Canny edge detector parameters by hand. In this article, I'll show you my automatic, parameter free Canny edge detector.
pyimagesearch.com
'PyImageSearch' 카테고리의 다른 글
| OpenCV - Histogram Equalization (0) | 2025.06.16 |
|---|---|
| OpenCV - Image Histograms (0) | 2025.06.15 |
| OpenCV - Image Gradients(엣지검출) (0) | 2025.06.13 |
| OpenCV - Thresholding(이진화) (0) | 2025.06.12 |
| OpenCV - Color Spaces (0) | 2025.06.12 |





