image processing - 실습 4주차
Gaussian filter 실습


- 라이브러리 목록
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
#library add
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
from my_library.padding import my_padding #my_padding 함수 사용 가능
- my_get_Gaussian2D_mask
def my_get_Gaussian2D_mask(msize,sigma=1):
# 2D gaussian filter만들기
y,x = np.mgrid[-(msize//2):(msize//2)+1, -(msize//2):(msize//2)+1]
#2차 가우시안 mask생성
gaus2D = 1/(2*np.pi*sigma**2) * np.exp(-((x**2 + y**2 )/(2*sigma**2)))
#mask의 총 합 = 1
gaus2D = gaus2D / np.sum(gaus2D);
return gaus2D
- my_get_Gaussian1D_mask
def my_get_Gaussian1D_mask(msize,sigma=1):
# 2D gaussian filter만들기
x = np.full((1,msize),[range(-(msize//2),(msize//2)+1)])
#1차 가우시안 mask생성
gaus1D = 1/(np.sqrt(2*np.pi)*sigma ) * np.exp(-((x*x)/(2*sigma*sigma)))
#mask의 총 합 = 1
gaus1D /= np.sum(gaus1D)
return gaus1D
-
my_filtering
padding을 설정해준다. 여기에서는 zero padding을 사용하였다.
def my_filtering(src,mask,pad_type='zero'):
(h,w) = src.shape
#mask의 크기
(m_h,m_w) = mask.shape
#직접 구현한 my_padding 함수를 이용
pad_img = my_padding(src,(m_h//2 ,m_w//2),pad_type)
print('<mask>')
print(mask)
dst = np.zeros((h,w))
#시간 측정을 위해서는 4중 for문으로 해야한다.
for row in range(h):
for col in range(w):
sum = 0
for m_row in range(m_h):
for m_col in range(m_w):
sum+=pad_img[row+m_row,col+m_col] *mask[m_row,m_col]
dst[row,col] = sum
return dst
-
main문
1D gaussian과 2D gaussian의 결과가 같은지 확인해본다( 시간측정 )
if __name__=='__main__':
src = cv2.imread('../imgs/lena.png', cv2.IMREAD_GRAYSCALE)
mask_size = 5
gaus2D = my_get_Gaussian2D_mask(mask_size)
gaus1D = my_get_Gaussian1D_mask(mask_size)
print('mask size : ',mask_size)
print('1D 가우시안')
start = time.perf_counter() #시간 측정 시작
dst_gaus1D = my_filtering(src, gaus1D.T)
dst_gaus1D = my_filtering(dst_gaus1D, gaus1D)
end = time.perf_counter() #시간 측정 끝
print('1D time : ',end-start)
print('2D 가우시안')
start = time.perf_counter() # 시간 측정 시작
dst_gaus2D = my_filtering(src,gaus2D)
end = time.perf_counter() # 시간 측정 끝
print('2D time : ', end - start)
dst_gaus1D = np.clip(dst_gaus1D, 0, 255)
dst_gaus1D = dst_gaus1D.astype(np.uint8)
dst_gaus2D = np.clip(dst_gaus2D, 0, 255)
dst_gaus2D = dst_gaus2D.astype(np.uint8)
cv2.imshow('original', src)
cv2.imshow('dst_gaus1D', dst_gaus1D)
cv2.imshow('dst_gaus2D', dst_gaus2D)
cv2.waitKey()
cv2.destroyAllWindows()
결과 화면


==
1D time : 3.0883317000000003
2D time : 5.460871700000001
이를 보았을떄 1D 가우시안의 시간이 절반정도 더 적게 걸린다는 것을 확인해볼수 있다.