머신러닝(파이썬) - Sobel Filtering(2)

LSH·2023년 7월 14일
0

교육 정보

  • 교육 명: 경기미래기술학교 AI 교육
  • 교육 기간: 2023.05.08 ~ 2023.10.31
  • 오늘의 커리큘럼:
    파이썬 기반의 머신러닝 이해와 실습 (06/14~07/07)
  • 강사: 양정은 강사님
  • 강의 계획:
    1. 개발환경세팅 - IDE, 가상환경
    2. 인공지능을 위한 Python
    3. KNN 구현을 위한 NumPy
    4. K Nearest Neighbors Classification 구현
    5. K Means Clustering Mini-project
    6. Scikit-learn을 이용한 SVM의 학습
    7. Decision Tree의 개념
    8. ID3 Algorithm
    9. Impurity Metrics - Information Gain Ratio, Gini Index
    10. Decision Tree 구현
    11. 확률 기초
    12. Bayes 정리 예시
    13. Naive Bayes Classifier
    14. Gaussian Naive Bayes Classifier

Sobel Filtering

  • 이미지 필터링
  • 머신러닝, 딥러닝에서 많이쓰이는 연산

for문 없이 Correlation 구현해보기

  • for문은 연산속도를 매우 저하시키므로 for문 사용을 지양
    • for문을 사용할 경우 데이터가 산발적으로 분포되어있으므로 CPU에서 연산을 하기 위해 RAM에서 데이터를 가져오는 fetching을 너무 자주 해야 함
    • numpy는 데이터를 밀집도있게 처리하여 fetching을 줄여 연산속도를 줄임
import numpy as np

np.random.seed(0)

data = np.random.randint(-1, 2, (10,))
filter_ = np.array([-1, 1, -1])
print(f'{data = }')
print(f'{filter_ = }')

L = len(data)
F = len(filter_)
L_ = L - F + 1

L_array = np.arange(L_).reshape(-1, 1)
adding = np.arange(F).reshape(1, -1)
print(L_array)
L_idx = L_array + adding
print(L_idx)

window = data[L_idx]
print(f'{window=}')
filtered = np.dot(window, filter_)

filtered = np.array(filtered)
print('filtering result:', filtered)

#
# 결과

data = array([-1,  0, -1,  0,  0,  1, -1,  1, -1, -1])

filter_ = array([-1,  1, -1])

[[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]]
 
[[0 1 2]
 [1 2 3]
 [2 3 4]
 [3 4 5]
 [4 5 6]
 [5 6 7]
 [6 7 8]
 [7 8 9]]
 
window=array([[-1,  0, -1],
       [ 0, -1,  0],
       [-1,  0,  0],
       [ 0,  0,  1],
       [ 0,  1, -1],
       [ 1, -1,  1],
       [-1,  1, -1],
       [ 1, -1, -1]])
       
filtering result: [ 2 -1  1 -1  2 -3  3 -1]

sobel filter의 개념

  • 딥러닝의 연산을 이해하기 위한 선행 학습
    • 딥러닝은 sobel filter에서 filter에 사용되는 값을 학습하는것
  • sobel filter 자체는 edge detection, 즉 사물의 경계를 구분하는 역할
    • edge가 이미지에서 가장 많은 정보를 담고있기때문에 edge를 구분해서 이것만 처리하면 속도가 훨씬 빨라질수 있음

X filter & Y filter

  • 3*3 행렬의 모습을 가짐
  • -2~2까지의 값을 가짐
  • 좌우 혹은 상하 대칭의 모습을 가짐
  • x filter는 수평방향으로 밝기 변화가 있을때 반응, y filter는 수직 방향으로 밝기 변화가 있을때 반응
    필터의 값이 어두운 곳에서 밝은 곳으로 변화하는 경우를 detection 해주는 경우, 비슷하게 어두운곳에서 밝은 곳을 지나갈때 가장 높은 값을 반환하기때문에서 높은 값이 나오는 부분에서는 그림이 어두운곳에서 밝은곳으로 변화하고 낮은 값이 나올경우 이미지가 밝은곳에서 어두운쪽으로 변화함을 알 수 있음

이미지 생성/불러와서 sober filtering 해보기

  • 이미지 생성
b_patch = 0 * np.ones(shape=(10, 10))
w_patch = 255 * np.ones(shape=(10, 10))

img1 = np.hstack([b_patch, w_patch])
img2 = np.hstack([w_patch, b_patch])
img = np.vstack([img1, img2])
img_ext = np.tile(img, reps=(2, 2))
  • 이미지 불러오기
img = np.array(Image.open('contrast_image.png').convert('L'))
  • 범위 설정 및 filtering (X축) → 범위가 왜 이렇게 설정되는지를 이해하기
H, W = img.shape
Fx, Fy = len(sobel_x), len(sobel_y)

H_ = H - Fx + 1
W_ = W - Fx + 1

x_filtered = list()
for h_idx in range(H_):
    for w_idx in range(W_):
        window = img[h_idx:h_idx + Fx, w_idx:w_idx + Fx]
        x_filtered.append((window * sobel_x).sum())
x_filtered = np.array(x_filtered).reshape(H_, W_)

→ Y축으로도 동일하게 진행

기타 사항 노션에 백업함

profile
:D

0개의 댓글