본문 바로가기

PyImageSearch

OpenCV - Edge detection

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)을 사용하여 진짜 엣지만 선별
  • 따라서 임곗값을 튜닝하는것이 매우 중요함
  • 방법:
    1. 강한 엣지
    2. T lower < G < T upper → 강한 에지와 연결 시에만 유지, 아니면 버림
    3. 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) 노이즈는 걸러내, 주요 구조(물고기·카메라·컵 등)를 충실히 검출

 


출처

https://pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny/?_ga=2.30498870.886285686.3012190875-776340303.3012033769

 

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

https://pyimagesearch.com/2015/04/06/zero-parameter-automatic-canny-edge-detection-with-python-and-opencv/?_ga=2.227959444.886285686.3012190875-776340303.3012033769

 

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