일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GUI
- MariaDB
- k8s
- 컴퓨터 비전
- Docker
- 데이터베이스
- 텐서플로우
- Tkinter
- 논문 리뷰
- pytorch
- FLASK
- 파이썬
- Computer Vision
- 그래픽 유저 인터페이스
- Django
- 딥러닝
- 파이토치
- yaml
- 장고
- vue.js
- 웹 프로그래밍
- paper review
- kubernetes
- Python
- tensorflow
- POD
- numpy
- OpenCV
- Deep Learning
- Web Programming
- Today
- Total
Maxima's Lab
[Python, Opencv] Edge Detection (엣지 검출) - Sobel Filter (소벨 필터) 본문
[Python, Opencv] Edge Detection (엣지 검출) - Sobel Filter (소벨 필터)
Minima 2022. 6. 29. 00:27안녕하세요, 오늘은 Edge Detection을 하는 방법 중 Sobel Filter를 활용하는 방법에 대해서 알아보겠습니다.
이미지 처리를 하는데 있어서 Edge Detection을 하는 것은 매우 중요한 알고리즘입니다. 이미지에서의 Edge(엣지)는 반사율, 조명, 방향 등이 변함에 따라 발생하게 됩니다. 이러한 Edge를 검출하기 위해 Sobel Filter (소벨 필터)를 사용해보겠습니다.
소벨 필터를 적용하기 위한 방법은 다음과 같습니다.
- Opencv 내 cv2.Sobel() 함수 사용
- 직접 Sobel Filter 생성 & Opencv 내 cv2.filter2D() 함수 사용
다음의 Original Image를 Sobel Filter를 사용해서 Edge를 검출하는 코드에 대한 예시입니다.
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()
위의 코드 내 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()
유사하게, 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()
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()
이상으로, Edge detection를 위한 방법 중의 하나인 Sobel Filter를 적용하는 방법에 대해서 알아보았습니다.
'Python > Opencv' 카테고리의 다른 글
[Python, Opencv] Binary Objects을 포함하는 가장 작은 사각형 찾기 (0) | 2024.03.16 |
---|---|
[Python, Opencv] Mouse Event (마우스 이벤트) (0) | 2022.07.06 |
[Python, Opencv] Template matching (템플릿 매칭) (0) | 2022.06.14 |
[Python, Opencv] Kmeans Clustering (Image Segmentation) & 3-D Scatter Plot (0) | 2022.06.02 |