Canny Edge Detection
Canny 에지 검출은 노이즈를 줄이고, 급격한 밝기 변화를 감지하며, 컴퓨터 비전을 위한 얇은 에지 맵을 생성하는 다단계 알고리즘입니다.
Canny 에지 검출은 밝기의 급격한 변화를 식별해 얇은 이진 에지 맵으로 변환하는 다단계 이미지 처리 알고리즘입니다. 노이즈를 줄이고, 밝기 변화 지점을 찾으며, 신뢰할 수 있는 에지 픽셀을 연결해 윤곽을 만듭니다. 컴퓨터 비전에서 이러한 윤곽은 형상 분석과 측정을 위한 이미지 구조를 표현합니다.
John Canny는 1983년에 이 방법을 개발하고 1986년 논문 에지 검출에 대한 계산적 접근에서 설명했습니다. 이 설계는 실제 에지를 검출하고, 정확한 위치를 찾으며, 에지마다 하나의 응답을 생성한다는 세 가지 목표 간의 균형을 맞춥니다. "Canny 에지 검출기"는 이 알고리즘의 다른 이름입니다.
Canny 에지 검출의 작동 방식#
이 알고리즘은 데이터 전처리와 필터링 및 연결성 분석을 결합합니다. 5단계는 각각 다음과 같은 역할을 합니다.
- 노이즈 감소: 가우시안 스무딩은 거리에 따라 가중치를 달리해 인접 픽셀의 평균을 구함으로써 원치 않는 에지를 생성할 수 있는 변동을 억제합니다.
- 그래디언트 추정: 수평 및 수직 미분값은 밝기가 얼마나 빠르게 변하는지 측정합니다. 두 값을 조합해 에지 강도와 경계에 수직인 방향을 구합니다. OpenCV는 이 단계에서 Sobel 미분을 사용합니다.
- 에지 세선화: 비최대 억제는 그래디언트 방향을 따라 국소 그래디언트 최댓값을 유지하여 넓은 띠 대신 얇은 능선을 생성합니다.
- 이중 임계값 적용: 높은 임계값은 강한 에지를 식별하고, 낮은 임계값은 약한 응답을 제거합니다. 두 임계값 사이의 픽셀은 후보가 됩니다.
- 히스테리시스 연결: 후보 픽셀은 다른 후보를 거쳐 강한 에지와 연결된 경우 유지됩니다. 고립된 후보는 제거됩니다.
임계값, 스무딩 및 실패 모드#
임계값은 원시 밝기나 모델 신뢰도가 아니라 그래디언트 강도에 적용됩니다. 임계값을 낮추면 더 많은 디테일과 노이즈가 보존되고, 높이면 약한 경계가 제거됩니다. 높은 임계값을 높이면 히스테리시스 연결에 사용할 수 있는 강한 에지 시드도 줄어듭니다.
가우시안 스케일은 별도의 트레이드오프를 제어합니다. 스무딩을 강화하면 노이즈는 억제되지만 미세한 구조도 사라집니다. scikit-image의 노이즈가 있는 사각형 예제에서는 가우시안 표준 편차를 변경하여 사각형 주변에 남는 노이즈의 양을 조절합니다.
균열 검사에서는 거친 콘크리트 표면으로 인해 원치 않는 텍스처 에지와 불완전한 균열 윤곽선이 발생합니다. 임계값을 높이면 일부 오검출 에지가 제거되는 동시에 실제 균열의 일부도 사라집니다.
Sobel은 강도 미분을 추정하고, Canny는 그래디언트 추정에 스무딩, 세선화 및 연결성 기반 선택을 결합합니다. Canny의 세선화 단계는 주변 픽셀을 비교하는 반면, 객체 탐지 NMS는 겹치는 예측 박스를 비교합니다.
Python에서의 Canny 에지 검출#
pip install opencv-python numpy으로 종속 항목을 설치합니다. 이 예제에서는 OpenCV를 사용하여 버스 샘플의 에지 맵을 저장합니다:
from urllib.request import urlopen
import cv2
import numpy as np
with urlopen("https://ultralytics.com/images/bus.jpg") as response:
encoded = np.frombuffer(response.read(), dtype=np.uint8)
gray = cv2.imdecode(encoded, cv2.IMREAD_GRAYSCALE)
# 강도 그래디언트를 계산하기 전에 이미지를 스무딩합니다.
smoothed = cv2.GaussianBlur(gray, (5, 5), 1.4)
edges = cv2.Canny(smoothed, 50, 150, L2gradient=True)
cv2.imwrite("canny_edges.png", edges)저장된 PNG에는 검은색 배경에 보존된 에지가 흰색으로 표시됩니다. OpenCV 에지 검출 워크플로에서 Canny의 두 번째 및 세 번째 인수는 낮은 임계값과 높은 임계값을 지정합니다. L2gradient=True은 유클리드 그래디언트 크기를 사용합니다. 기본값은 수평 및 수직 미분의 절댓값을 더합니다. 이러한 선택에 따라 그래디언트 값과 임계값 동작이 달라집니다.
응용 분야 및 관련 비전 작업#
Canny는 기하학적 특징 추출을 지원합니다. scikit-image의 선 검출 예제는 카메라맨 사진에 Canny를 적용한 다음, 확률적 허프 변환으로 직선 선분을 추출합니다. Canny는 에지 픽셀을 제공하고, 허프 투표는 이를 그룹화하여 선을 만듭니다. 객체 탐지는 카테고리와 박스를 지정하고, 인스턴스 분할은 픽셀을 개별 객체에 할당합니다.
Ultralytics YOLO26 분할은 객체 분리를 위한 마스크를 반환하며, 이 마스크를 사용해 별도의 Canny 처리를 위한 이미지 영역을 선택할 수 있습니다. 이를 통해 학습된 객체 선택과 기존 방식의 경계 추출을 결합합니다.
생성형 AI에서 ControlNet은 Canny 맵을 확산 모델의 공간 조건으로 사용합니다. Canny 조건부 구현은 텍스트 프롬프트와 함께 추출한 윤곽선을 사용하여 Stable Diffusion 1.5 생성을 유도합니다.










