경기도미래기술학교 AI개발자 부트캠프 48일차 TIL- 소벨 필터링.

2023. 7. 13. 11:26카테고리 없음

반응형

from . 양정은 강사님 프로젝트 과제임.

 

소벨 필터링 ? 이미지 처리나 컴퓨터 비전에서 사용되는 엣지 감지 알고리즘.

일반적으로 가장자리에 해당하는 이미지의 높은 공간 주파수 영역을 강조하는 방법을 제공한다.

 

 

 

 

white_patch = 255*np.ones(shape=(10, 10)) # 10,10 짜리 흰색패치
black_patch = 0*np.ones(shape=(10, 10)) # 10,10 짜리 검정패치

print(white_patch)

img1 = np.hstack([white_patch, black_patch])
img2 = np.hstack([black_patch, white_patch])
img = np.vstack([img1, img2])

fig, ax = plt.subplots(figsize=(8, 8))
# ax.imshow(img, cmap='gray') # 흑백 이미지를 만들 것이여서 colormap은 'gray'로
ax.imshow(img) # 흑백 이미지를 만들 것이여서 colormap은 'gray'로

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

cmap을 적용 안한 것과 한 것. 이렇게 되어 버린다. 신기. 3번째 사진은 3개를 붙여봤다.

data = np.arange(5)
print(data)

print("repaet:", np.repeat(data, repeats=3))
print("tile:", np.tile(data, reps=3))

 

np.repeat은 그 숫자 자체를 몇 번 반복하고(파라미터는  repeats을 써야함.)

np.tile은 전체를 한바퀴 도는 것을 반복한다. (파라미터는 reps를 써야함.)

 

data = np.arange(6).reshape(2, 3)
print(data)

# axis=0 방향으로 반복.
print("repeat (axis=0): \n", np.repeat(data, repeats=3, axis=0))
#axis=1 방향으로 반복.
print("repeat (axis=1): \n", np.repeat(data, repeats=3, axis=1))
print("repeat (axis=0 and axis=1) : \n", np.repeat(np.repeat(data, repeats=2, axis=1), repeats=3, axis=1))

repeat 연습. 진심 뭐라노! 이거 이해가 잘안된다.

 

data = np.arange(6).reshape(2, 3)
print(data)

print("tile(axis=0):\n", np.tile(data, reps=[3, 1]))
print("tile(axis=1):\n", np.tile(data, reps=[1, 3]))
print("tile(axis=0 and exis=1):\n", np.tile(data, reps=[3, 3]))

tile 연습. 이거는 살짝 괜찮다 그래도.

 

white_patch = 255*np.ones(shape=(10, 10)) # 10,10 짜리 흰색패치
black_patch = 0*np.ones(shape=(10, 10)) # 10,10 짜리 검정패치

print(white_patch)

img1 = np.hstack([white_patch, black_patch])
img2 = np.hstack([black_patch, white_patch])
img = np.vstack([img1, img2])

img = np.tile(img, (4,4))

fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(img, cmap='gray') # 흑백 이미지를 만들 것이여서 colormap은 'gray'로
# ax.imshow(img) # 흑백 이미지를 만들 것이여서 colormap은 'gray'로

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

tile을 이용한 체스판 만들기1.

white_black_array = np.array([[255, 0], [0, 255]])

print(white_black_array)

chess_board = np.tile(white_black_array, (4, 4))

fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(chess_board, cmap='gray')

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

tile을 이용한 체스판 만들기2.

 

white_patch = 255*np.ones(shape=(10, 10)) # 10,10 짜리 흰색패치
black_patch = 0*np.ones(shape=(10, 10)) # 10,10 짜리 검정패치
gray_patch = 125*np.ones(shape=(10, 10)) # 10,10 짜리 회색패치

print(white_patch)

img1 = np.hstack([white_patch, gray_patch])
img2 = np.hstack([gray_patch, black_patch])
img = np.vstack([img1, img2])

img = np.tile(img, (4,4))

fig, ax = plt.subplots(figsize=(8, 8))
ax.imshow(img, cmap='gray') # 흑백 이미지를 만들 것이여서 colormap은 'gray'로
# ax.imshow(img) # 흑백 이미지를 만들 것이여서 colormap은 'gray'로

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

회색을 이용해서 체스판 만들기.

img = np.arange(0, 151, 50).reshape(1, -1)
print(img)
img = img.repeat(100, axis=0).repeat(30, axis=1)

fig, ax = plt.subplots(figsize=(8,4))
ax.imshow(img, cmap='gray', vmax=255, vmin=0)

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

다음은 힌색부터 뒤집어져 나오는 것.

 

import numpy as np
import matplotlib.pyplot as plt

img = np.arange(256, 0, -50).reshape(-1, 1)
print(img)
img = img.repeat(30, axis=1).repeat(10, axis=0)

fig, ax = plt.subplots(figsize=(8, 4))
ax.imshow(img, cmap='gray')

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

 

 

 

2차원에서 axis=0을 한다면, 각 인덱스에 해당하는 리스트를 repeats만큼 반복한다.

 

img = np.arange(0, 256, 50)[::-1]
print(img)
img = np.arange(0, 256, 50)[::-1].reshape(-1,1)

print(img)

img1 = np.arange(0, 151, 1).reshape(1, -1)
# print(img1)
img1 = img1.repeat(100, axis=0).repeat(2, axis=1)
print(img1)

img2 = np.arange(151, 0, -1).reshape(1, -1)

img2 = img2.repeat(100, axis=0).repeat(2, axis=1)

img = np.vstack([img1, img2])


fig, ax = plt.subplots(figsize=(8,4))
ax.imshow(img, cmap='gray')

ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)

plt.show()

다음은 그라데이션. 이건 위에거에 비해 별로 안어려웠다.

 

Dimensional Window Extraction.

 

윈도우의 갯수 = 전체 데이터 길이 - 윈도우의 길이 +1

공식. L' = L - W +1 혹은 L-(W-1)

 

2-Dimensional Window Extraction

W' =

H' =

각각 계산 한다음 W' * H'를 한다.

 

arrays = []

for i in range(5):
    first_one = 10 * (i + 1)
    last_one = 70 + first_one
    data_list = np.arange(first_one, last_one, 10)
    arrays.append(data_list)

data1, data2, data3, data4, data5 = arrays
data_stack = np.vstack(arrays)

data_stack_shape = data_stack.shape

W = 3

# L_ = L - W + 1

windows = []
for i in range(data_stack_shape[0] - W + 1):
    for j in range(data_stack_shape[1] - W + 1):
        window = data_stack[i:i+W, j:j+W]
        print(i+1,'-',j+1,'번째 윈도우')
        print(window)

이런 식으로 나온다.

data1 = 10* np.arange(1, 8).reshape(1, -1)
data2 = 10* np.arange(5).reshape(-1, 1)

data = data1 + data2
print(data)

브로드캐스팅을 통한 계산 방법.

import numpy as np

arrays = []
for i in range(5):
    first_one = 10 * (i + 1)
    last_one = 70 + first_one
    data_list = np.arange(first_one, last_one, 10)
    arrays.append(data_list)

data_stack = np.vstack(arrays)

window_size = (3, 3)

windows = np.lib.stride_tricks.sliding_window_view(data_stack, window_size)

# Print all the windows
for i in range(windows.shape[0]):
    for j in range(windows.shape[1]):
        print(f'Window at position ({i+1}, {j+1}):')
        print(windows[i, j])
        print()

gpt 물어보니까 np.lib.stride_tricks.sliding_window_view 이런게 있다고 한다. 

 

 

Correlation - windows를 뽑으면서 내가 원하는 패턴이 있는 부분을 추출하는 연산.

 

내적 : 원소별 곱의 합.

 

Correlation 연습.1

data = np.random.randint(-1, 2, (10, ))
print('data: ',data)
filter_ = np.array([-1, 1, -1])
print('filter: ',filter_)

L = len(data)
F = len(filter_)
print('F_Length: ', F)
L_ = L - F + 1
filtered = []

for idx in range(L_):
    window = data[idx : idx + F]
    print('window for', idx,':', window )
    filtered.append(np.dot(window, filter_))

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

연습2.

np.array([[1, 2, 5], [-10, 2, -2], [5, 1, -4]])를 필터로 계산하기.

data1 = 10* np.arange(1, 8).reshape(1, -1)
data2 = 10* np.arange(5).reshape(-1, 1)

data = data1 + data2
print("Data:\n", data)
print(data.shape)

filter_ = np.array([[1,2,5],[-10,2,-2],[5,1,-4]])
print("Filter:\n", filter_)



F = filter_.shape[0] 
print('F_length : ', F)
L = data.shape[0] 
L_ = L - F + 1     
print('L_: ',L_)
W_ = data.shape[1] - F + 1 
print('W_: ',W_)
filtered = []

for i in range(L_):
    for j in range(W_):
        window = data[i : i + F, j : j + F]
        print(f'Window for ({i}, {j}):\n', window)
        filtered.append(np.sum(window * filter_)) 
        print(i, j, '번째 filtered', '\n', filtered)

filtered = np.array(filtered).reshape((L_, W_))
print('Filtered:\n', filtered)

728x90