OpenCV 강좌, Sobel, Scharr, Laplacian 필터 적용하기

OpenCV(Open Source Computer Vision Library)는 이미지와 비디오 처리에 매우 유용한 컴퓨터 비전 라이브러리로, 이미지의 엣지 감지(Edge Detection)를 비롯한 다양한 필터 기능을 제공합니다. 이미지에서 특징을 추출하는 것은 컴퓨터 비전에서 매우 중요한 작업이며, Sobel, Scharr, Laplacian 필터는 엣지 감지에 자주 사용되는 알고리즘입니다. 이번 포스팅에서는 이 세 가지 필터의 원리와 OpenCV를 사용하여 실제로 적용하는 방법을 살펴보겠습니다.

1. 엣지 감지(Edge Detection)란?

엣지는 이미지 내에서 픽셀 값의 급격한 변화가 발생하는 곳을 의미합니다. 엣지 감지 알고리즘은 이미지의 디테일을 추출하여 물체 인식, 이미지 분할 등에 활용됩니다. 이러한 알고리즘은 주로 이미지 처리의 초기 단계에서 적용되며, 엣지를 검출함으로써 이미지의 중요한 정보를 간직할 수 있습니다.

2. Sobel 필터

Sobel 필터는 수평 및 수직 방향의 경계 강도를 측정하는 데 사용되는 미분 필터입니다. Sobel 연산자는 두 개의 3×3 커널을 사용하여 수평과 수직 방향에서의 경계를 감지합니다.

2.1 Sobel 커널

수평(Sx)과 수직(Sy) 방향의 Sobel 커널은 다음과 같습니다:

Sx = [[-1, 0, 1],
           [-2, 0, 2],
           [-1, 0, 1]]

Sy = [[1, 2, 1],
      [0, 0, 0],
      [-1, -2, -1]]

2.2 Sobel 필터 적용하기

OpenCV에서 Sobel 필터를 적용하는 과정은 다음과 같습니다. Python과 OpenCV를 활용하여 이미지에 Sobel 필터를 적용하는 예제를 살펴보겠습니다.

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 이미지 읽기
image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)

# Sobel 필터 적용
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 = np.sqrt(sobel_x**2 + sobel_y**2)

# 결과 시각화
plt.subplot(1, 3, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 3, 2), plt.imshow(sobel_x, cmap='gray'), plt.title('Sobel X')
plt.subplot(1, 3, 3), plt.imshow(sobel_y, cmap='gray'), plt.title('Sobel Y')

plt.show()

위의 코드에서 cv2.Sobel 함수를 사용하여 이미지의 수평 및 수직 에지를 각각 추출합니다. 결과 합성은 수평과 수직 에지의 크기를 계산하여 최종적으로 엣지를 시각화합니다.

3. Scharr 필터

Scharr 필터는 Sobel 필터의 변형으로, 커널의 값을 조정하여 더 나은 엣지 검출 결과를 제공합니다. Scharr 필터는 Sobel 필터보다 더 깊은 커널을 사용하여 엣지 감지의 정확도를 높입니다.

3.1 Scharr 커널

Scharr 필터의 수평(Sx) 및 수직(Sy) 커널은 다음과 같습니다:

Sx = [[-3, 0, 3],
           [-10, 0, 10],
           [-3, 0, 3]]

Sy = [[3, 10, 3],
      [0, 0, 0],
      [-3, -10, -3]]

3.2 Scharr 필터 적용하기

Scharr 필터를 OpenCV를 사용하여 적용하는 방법을 살펴보겠습니다. 다음의 예제 코드는 Scharr 필터를 이미지에 적용하는 방법을 보여줍니다.

# Scharr 필터 적용
scharr_x = cv2.Scharr(image, cv2.CV_64F, 1, 0)  # 수평 방향
scharr_y = cv2.Scharr(image, cv2.CV_64F, 0, 1)  # 수직 방향

# 결과 합성
scharr = np.sqrt(scharr_x**2 + scharr_y**2)

# 결과 시각화
plt.subplot(1, 3, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 3, 2), plt.imshow(scharr_x, cmap='gray'), plt.title('Scharr X')
plt.subplot(1, 3, 3), plt.imshow(scharr_y, cmap='gray'), plt.title('Scharr Y')

plt.show()

위 코드에서 cv2.Scharr 함수를 사용하면 Scharr 필터를 수평 및 수직 방향으로 적용하여 엣지를 추출합니다. 결과를 시각화하여 Scharr 필터의 성능을 확인할 수 있습니다.

4. Laplacian 필터

Laplacian 필터는 이미지의 두 번째 미분을 사용하여 엣지를 탐지하는 방법입니다. 이 필터는 이미지의 모든 방향에서의 에지를 검출할 수 있는 특징이 있습니다. 일반적으로 Laplacian 필터는 Gaussian 필터와 함께 사용하여 노이즈를 감소시키고 에지를 더욱 뚜렷하게 만듭니다.

4.1 Laplacian 커널

Laplacian 필터는 다음과 같은 3×3 커널을 사용합니다:

Laplacian = [[0, -1, 0],
                  [-1, 4, -1],
                  [0, -1, 0]]

4.2 Laplacian 필터 적용하기

OpenCV에서 Laplacian 필터를 적용하는 방법은 매우 간단합니다. 아래의 예제 코드를 통해 Laplacian 필터를 이미지에 적용하는 방법을 살펴보겠습니다.

# Laplacian 필터 적용
laplacian = cv2.Laplacian(image, cv2.CV_64F)

# 결과 시각화
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')

plt.show()

위 코드에서 cv2.Laplacian 함수를 사용하여 이미지를 처리하고, 결과를 시각화하여 Laplacian 필터가 어떻게 적용되었는지 확인할 수 있습니다.

5. 결과 비교

Sobel, Scharr, Laplacian 필터를 적용한 결과를 비교하여 각 필터의 특징과 성능을 이해해보겠습니다. 다음의 코드를 사용하여 세 가지 필터의 결과를 동일한 이미지에 대해 시각화할 수 있습니다.

# Sobel, Scharr 및 Laplacian 필터 결과 비교
plt.figure(figsize=(15, 5))
plt.subplot(1, 4, 1), plt.imshow(image, cmap='gray'), plt.title('Original Image')
plt.subplot(1, 4, 2), plt.imshow(sobel, cmap='gray'), plt.title('Sobel Filter')
plt.subplot(1, 4, 3), plt.imshow(scharr, cmap='gray'), plt.title('Scharr Filter')
plt.subplot(1, 4, 4), plt.imshow(laplacian, cmap='gray'), plt.title('Laplacian Filter')

plt.show()

위 코드를 실행하면 원본 이미지와 함께 Sobel, Scharr, Laplacian 필터의 결과를 비교할 수 있습니다. 각 필터는 엣지 검출의 강도와 방향성을 다르게 표현합니다.

6. 결론

Sobel, Scharr, Laplacian 필터는 이미지 처리의 중요한 도구로, 컴퓨터 비전 분야에서 광범위하게 사용됩니다. 이 세 가지 필터를 통해 엣지를 효과적으로 감지할 수 있으며, 각각의 필터가 가지는 특징과 장점을 이해하는 것이 중요합니다. 이 블로그에서 제공한 예제를 기반으로 더 다양한 이미지 처리 기법을 적용해 보시기를 바랍니다. OpenCV는 강력한 이미지 처리 라이브러리이므로, 다양한 알고리즘을 탐구하고 실험하여 실력을 향상시킬 수 있습니다.

이 게시글을 통해 OpenCV의 기초적인 필터링 기법과 그 적용 방법에 대해 이해할 수 있었기를 바랍니다. 앞으로도 다양한 OpenCV 강좌를 통해 더 많은 내용을 다룰 예정이니 많은 기대 부탁드립니다!