1 minute read


Gaussian filter 실습

image

image

  • 라이브러리 목록
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()

결과 화면

image

image

==

1D time :  3.0883317000000003

2D time :  5.460871700000001

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