반응형
OpenCV를 활용한 엣지 검출 (Canny, Sobel, Laplacian)
1. 개요
엣지 검출(Edge Detection)은 이미지에서 경계를 찾아내는 중요한 영상 처리 기법입니다. 경계선은 물체의 형상과 구조를 나타내는 중요한 요소이며, 다양한 컴퓨터 비전 응용에서 활용됩니다. 대표적인 엣지 검출 방법에는 Sobel, Laplacian, Canny 필터가 있으며, 각각의 방법은 특정한 목적과 특성을 가집니다.
이번 글에서는 OpenCV를 활용하여 Sobel 필터, Laplacian 필터, Canny 엣지 검출을 수행하는 방법을 설명하겠습니다.
2. 환경 설정
OpenCV를 설치하지 않았다면 다음 명령어를 실행하여 설치합니다.
pip install opencv-python
또한, matplotlib을 사용하여 결과를 시각화할 것이므로 다음 명령어로 설치할 수 있습니다.
pip install matplotlib
3. 엣지 검출 기법
3.1 Sobel 필터
Sobel 필터는 미분을 이용하여 엣지를 검출하는 방법으로, 수평(x 방향)과 수직(y 방향)으로 미분 연산을 수행합니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 이미지 불러오기
def load_image(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
return img
# Sobel 필터 적용
def apply_sobel(image):
sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
sobel_combined = cv2.magnitude(sobel_x, sobel_y)
return sobel_x, sobel_y, sobel_combined
# 결과 시각화
def show_results(image, sobel_x, sobel_y, sobel_combined):
plt.figure(figsize=(10, 5))
plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 4, 2)
plt.imshow(sobel_x, cmap='gray')
plt.title('Sobel X')
plt.subplot(1, 4, 3)
plt.imshow(sobel_y, cmap='gray')
plt.title('Sobel Y')
plt.subplot(1, 4, 4)
plt.imshow(sobel_combined, cmap='gray')
plt.title('Sobel Combined')
plt.show()
# 실행 예제
image = load_image('sample.jpg')
sobel_x, sobel_y, sobel_combined = apply_sobel(image)
show_results(image, sobel_x, sobel_y, sobel_combined)
3.2 Laplacian 필터
Laplacian 필터는 2차 미분을 이용하여 엣지를 검출하는 방법입니다. 이 방법은 노이즈에 민감하지만 더 강한 엣지를 감지할 수 있습니다.
# Laplacian 필터 적용
def apply_laplacian(image):
laplacian = cv2.Laplacian(image, cv2.CV_64F)
return laplacian
# 실행 예제
laplacian = apply_laplacian(image)
# 결과 시각화
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(laplacian, cmap='gray')
plt.title('Laplacian Edge Detection')
plt.show()
3.3 Canny 엣지 검출
Canny 엣지 검출은 노이즈 제거, 그래디언트 계산, 비최대 억제, 이중 임계값을 활용하여 엣지를 검출하는 강력한 방법입니다.
# Canny 엣지 검출 적용
def apply_canny(image, low_threshold, high_threshold):
canny = cv2.Canny(image, low_threshold, high_threshold)
return canny
# 실행 예제
canny_edges = apply_canny(image, 50, 150)
# 결과 시각화
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.subplot(1, 2, 2)
plt.imshow(canny_edges, cmap='gray')
plt.title('Canny Edge Detection')
plt.show()
4. 결론
Sobel, Laplacian, Canny 엣지 검출 기법은 각기 다른 방식으로 엣지를 검출하며, 상황에 맞는 방법을 선택하는 것이 중요합니다.
- Sobel 필터: 방향성을 고려한 미분 연산을 수행하여 엣지를 검출합니다.
- Laplacian 필터: 2차 미분을 이용하여 강한 엣지를 감지하지만 노이즈에 민감합니다.
- Canny 엣지 검출: 다양한 필터링 과정을 거쳐 정교한 엣지 검출을 수행합니다.
OpenCV를 활용하여 다양한 영상 처리 응용에 엣지 검출 기법을 적용해 보시기 바랍니다!
반응형
'Python > OpenCV' 카테고리의 다른 글
| OpenCV 이미지 위에 텍스트 추가하기 (cv2.putText()) (0) | 2025.11.06 |
|---|---|
| Python OpenCV - 이미지 위에 선, 원, 사각형 그리기 (0) | 2025.11.05 |
| OpenCV를 활용한 이미지 필터링 (블러링, 가우시안 필터, 샤프닝) (0) | 2025.11.03 |
| OpenCV 이미지 밝기 및 명암 조절 (cv2.addWeighted()) (0) | 2025.11.02 |
| OpenCV 이미지 크기 조절, 회전 및 이동 (cv2.resize(), cv2.rotate(), cv2.warpAffine()) (0) | 2025.11.01 |