2023년 10월 7일
작성자: 조광형
1. Canny Edge Detection이란?
Canny Edge Detection은 이미지에서 경계를 검출하는 데 사용되는 알고리즘입니다.
이 알고리즘은 존 맥캐바니가 개발하였으며, 뛰어난 성능과 저항성을 가지고 있어 컴퓨터 비전 분야에서 널리 사용됩니다.
Canny Edge Detection은 이러한 과정을 통해 이미지 분석 및 객체 감지에 필수적인 경계를 정확하게 탐지하는 데 도움을 줍니다.
Canny Edge Detection은 세 가지 주요 단계로 구성됩니다:
- 노이즈 감소: 가우시안 필터를 이용하여 이미지의 노이즈를 제거합니다.
- 그라디언트 계산: 이미지의 엣지를 찾기 위해 각 픽셀에서 그라디언트를 계산합니다.
- 비최대 억제 및 이중 임계값: 엣지를 결정한 후, 비최대 억제를 통해 진정한 엣지만 남기고 불필요한 픽셀을 제거합니다. 이후 이중 임계값을 통해 엣지를 결정합니다.
2. Canny Edge Detection의 파라미터
Canny Edge Detection은 몇 가지 중요한 파라미터를 조정하여 성능을 최적화할 수 있습니다.
이 파라미터들은 감지의 정확도와 엣지의 수에 직접적인 영향을 미칩니다. 주요 파라미터는 다음과 같습니다:
- threshold1: 첫 번째 임계값으로, 엣지를 결정할 때 사용됩니다. 이 값보다 높은 그라디언트는 강한 엣지로 간주됩니다.
- threshold2: 두 번째 임계값으로, 약한 엣지를 결정하는 데 사용됩니다. threshold1보다 낮은 값을 가지며, 강한 엣지가 연결되어 있는 경우에만 엣지로 간주됩니다.
- apertureSize: Sobel 커널의 크기를 결정합니다. 기본값은 3이며, 1, 3, 5, 7 중 하나의 값을 가질 수 있습니다.
- L2gradient: 그라디언트의 세기를 계산하는 방법을 결정합니다. 기본값은 False이며, 기본 방식으로 계산됩니다. True로 설정하면 더 정확한 값을 얻을 수 있습니다.
3. 파라미터 조정의 중요성
Canny Edge Detection의 파라미터는 실세계 이미지의 특성과 구조에 따라 적절하게 조정되어야 합니다. 잘못된 값을 설정할 경우, 너무 많은 불필요한 엣지를 검출하거나 반대로 중요한 엣지를 놓치는 결과를 초래할 수 있습니다. 따라서 특정 이미지에 대해 파라미터를 조정하는 과정은 필수적입니다.
4. 파라미터 조정 예제 코드
다음은 OpenCV를 사용하여 Canny Edge Detection을 수행하는 파이썬 코드 예제입니다.
이 예제에서는 이미지 파일을 읽어 다양한 파라미터로 엣지를 검출하고 결과를 시각화합니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 이미지 읽기
image = cv2.imread('your_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Canny Edge Detection의 파라미터
threshold1 = 100
threshold2 = 200
apertureSize = 3
# Canny Edge Detection 수행
edges = cv2.Canny(gray, threshold1, threshold2, apertureSize=apertureSize)
# 결과 시각화
plt.figure(figsize=(10, 10))
plt.subplot(121), plt.imshow(gray, cmap='gray'), plt.title('Original Image')
plt.subplot(122), plt.imshow(edges, cmap='gray'), plt.title('Canny Edge Image')
plt.show()
5. 다양한 파라미터 조정 예제
이제 다양한 파라미터를 조정하여 결과를 비교해 보겠습니다. 아래 코드는 여러 임계값과 apertureSize를 사용하여 Canny Edge Detection의 효과를 비교합니다.
# 다양한 파라미터 설정
thresholds = [(50, 150), (100, 200), (150, 250)]
apertureSizes = [3, 5, 7]
plt.figure(figsize=(15, 10))
for i, (thresh1, thresh2) in enumerate(thresholds):
for j, apertureSize in enumerate(apertureSizes):
edges = cv2.Canny(gray, thresh1, thresh2, apertureSize=apertureSize)
plt.subplot(len(thresholds), len(apertureSizes), i * len(apertureSizes) + j + 1)
plt.imshow(edges, cmap='gray')
plt.title(f'Thresholds: {thresh1}, {thresh2} | Aperture Size: {apertureSize}')
plt.axis('off')
plt.tight_layout()
plt.show()
6. Canny Edge Detection의 성능 향상
Canny Edge Detection의 성능을 더 향상시키는 방법으로는 다음과 같은 방법들이 있습니다:
- 사전 처리(Pre-processing): 가우시안 블러(Gaussian Blur)를 사용하여 이미지를 사전 처리하면 노이즈를 줄이고, 더 뚜렷한 엣지를 찾을 수 있습니다.
- 후처리(Post-processing): 엣지 검출 후 필터링을 통해 더 깔끔한 결과를 얻을 수 있습니다. 예를 들어, dilation과 erosion을 사용할 수 있습니다.
- 기계 학습 기법: 머신러닝 또는 딥러닝 모델을 활용하여 이미지에서 필요한 특성만을 자동으로 학습한 후, 엣지 검출에 적용할 수 있습니다.
7. 결론
Canny Edge Detection은 이미지 프로세싱에서 매우 중요한 기술입니다.
적절한 파라미터 조정은 경계 검출의 정확도를 높이고, 다양한 응용 분야에 적용할 수 있는 강력한 도구가 됩니다.
이미지에 따른 최적의 파라미터를 찾는 과정은 반복적이며, 경험이 필요하지만, 이를 통해 더 나은 결과를 얻을 수 있습니다.
이번 강좌를 통해 Canny Edge Detection의 기본 개념과 파라미터 조정 방법을 배우게 되었기를 바랍니다.