Coding Memo

Haar Matrix 만들기 본문

Language/Python

Haar Matrix 만들기

minttea25 2020. 12. 29. 15:45

선형대수학에서 Discrete Wavelet Transform (DWT)에 대한 이미지 압축 관련으로 코딩한 것이 있다.

 

이미지를 행렬로 변환 시킨 뒤, Harr Matrix를 이용해 고주파와 저주파 성분을으로 나눈 다음 고주파 성분은 빼버리고 나머지 저주파 성분으로만 이미지를 저장시켜서 이미지의 용량을 줄이는 과정을 해보았다. 이는 실제로 JPEG 압축에서 쓰이는 방식이라고 하고 이미지를 보통 8*8로 잘라서 압축한다고 한다.

 

Haar Matrix를 만들기 위해서 다음의 URL를 참고 했다.

stackoverflow.com/questions/23869694/create-nxn-haar-matrix

 

Create NxN Haar Matrix

I can't find a definition for generating an un-normalized NxN Haar matrix. So what is the equation? see: http://en.wikipedia.org/wiki/Haar_wavelet Thx, Chris

stackoverflow.com

#make haarMatrix
def haarMatrix(n, normalized=True) :
    matrix = getHaarMatrix_T(n)

    if normalized:
        return normalizeMatrix(np.transpose(matrix))
    else :
        return np.transpose(matrix)

#make haarMatrix^t
def getHaarMatrix_T(n) :
    n = 2**np.ceil(np.log2(n))
    if n>2 :
        h = getHaarMatrix_T(n/2)
    else :
        return np.array([ [1, 1], [1, -1] ])

    #calculate upper haar part
    h_n = np.kron(h, [1, 1])
    #calculate lower haar part
    h_i = np.kron(np.eye(len(h)), [1, -1])
    # combine parts
    h = np.vstack((h_n, h_i))
    return h

#make length of all column vectors 1 (원소가 1, 0, -1뿐인 행렬만 유효)
def normalizeMatrix(matrix)  :
    #make base matrix with zero (this row will be not used)
    mat = np.zeros((1, matrix.shape[0]))

    #loop about length of columns
    for i in range(matrix.shape[0]) :
        #get ith column
        c = sum(np.abs(matrix[:, i]))
        mat = np.vstack([mat, matrix[:, i] / np.sqrt(c)])
        #print(np.transpose(mat))
    mat = np.transpose(mat)
    #except base matrix return matrix (c1 ~ c(max))
    return mat[:,1:matrix.shape[0]+1]

참고: 주석에 달려있듯이, normalize 하는 과정은 엔트리의 절대값이 1 이하인 경우인 행렬에서만 normalize 된다.

(오직 HaarMatrix를 정규화하기 위한 함수)

 

'Language > Python' 카테고리의 다른 글

BeautifulSoup와 Selenium을 이용한 web crawling - 0  (0) 2021.07.30
Twitter Crawling (tweepy)  (0) 2021.02.24