Maxima's Lab

[Python, Opencv] Edge Detection (엣지 검출) - Sobel Filter (소벨 필터) 본문

Python/Opencv

[Python, Opencv] Edge Detection (엣지 검출) - Sobel Filter (소벨 필터)

Minima 2022. 6. 29. 00:27
728x90
SMALL

안녕하세요, 오늘은 Edge Detection을 하는 방법 중 Sobel Filter를 활용하는 방법에 대해서 알아보겠습니다.

 

이미지 처리를 하는데 있어서 Edge Detection을 하는 것은 매우 중요한 알고리즘입니다. 이미지에서의 Edge(엣지)는 반사율, 조명, 방향 등이 변함에 따라 발생하게 됩니다. 이러한 Edge를 검출하기 위해 Sobel Filter (소벨 필터)를 사용해보겠습니다.

 

소벨 필터를 적용하기 위한 방법은 다음과 같습니다.

  • Opencv 내 cv2.Sobel() 함수 사용
  • 직접 Sobel Filter 생성 & Opencv 내 cv2.filter2D() 함수 사용 

 

다음의 Original Image를 Sobel Filter를 사용해서 Edge를 검출하는 코드에 대한 예시입니다.

 

Original Image

 

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

dx = cv2.Sobel(img, cv2.CV_64F, 1, 0, 3)
dy = cv2.Sobel(img, cv2.CV_64F, 0, 1, 3)

sobel = cv2.magnitude(dx, dy)
sobel = np.clip(sobel, 0, 255).astype(np.uint8)

plt.figure(figsize=(8,8))
plt.imshow(sobel)
plt.axis("off")
plt.show()

 

Sobel Filter를 적용한 결과

 

위의 코드 내  dx에 대하여, 모든 Pixel 값들을 절대값을 취하고 시각화한 결과는 다음과 같습니다.

 

dx_abs = np.abs(dx)
dx_abs = np.clip(dx_abs, 0, 255).astype(np.uint8)

plt.figure(figsize=(8,8))
plt.imshow(np.abs(dx))
plt.axis("off")
plt.show()

 

x축 방향의 변화량을 기준으로 Edge를 검출한 결과

 

유사하게, dy에 대하여 모든 Pixel 값들을 절대값을 취하고 시각화한 결과는 다음과 같습니다.

 

dy_abs = np.abs(dy)
dy_abs = np.clip(dy_abs, 0, 255).astype(np.uint8)

plt.figure(figsize=(8,8))
plt.imshow(dy_abs)
plt.axis("off")
plt.show()

 

y축 방향의 변화량을 기준으로 Edge를 검출한 결과

 

dx와 dy 값을 구하는 과정에 특정 Pixel 값은 음수(-)의 값을 가질 수 있기 때문에 각 축을 기준으로 Pixel 별 변화량의 절대값에 대한 결과를 시각화 하기 위해 np.abs() 함수를 적용하였습니다.

 

위에서 구한 dx와 dy를 통해 최종적으로 cv2.magnitude() 함수를 통해 벡터의 크기를 계산하고, np.clip(sobel, 0, 255) 함수를 통해 해당 sobel 내 각 픽셀값에 대해 0보다 작은 값들은 0값을, 255보다 큰 값들은 255 값으로 변환합니다.

 


 

다음은 Sobel Filter를 직접 생성하여, cv2.filter2D() 함수를 적용한 코드에 대한 예시입니다.

 

Fx = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
Fy = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])

edge_x = cv2.filter2D(img, cv2.CV_64F, Fx)
edge_y = cv2.filter2D(img, cv2.CV_64F, Fy)

sobel = cv2.magnitude(edge_x, edge_y)
sobel = np.clip(sobel, 0, 255).astype(np.uint8)

plt.figure(figsize=(8,8))
plt.imshow(sobel)
plt.axis("off")
plt.show()

 

Sobel Filter를 직접 생성 & cv2.filter2D() 함수를 적용한 결과

 

이상으로, Edge detection를 위한 방법 중의 하나인 Sobel Filter를 적용하는 방법에 대해서 알아보았습니다.

 

728x90
LIST
Comments