Coding Memo
Haar Matrix 만들기 본문
선형대수학에서 Discrete Wavelet Transform (DWT)에 대한 이미지 압축 관련으로 코딩한 것이 있다.
이미지를 행렬로 변환 시킨 뒤, Harr Matrix를 이용해 고주파와 저주파 성분을으로 나눈 다음 고주파 성분은 빼버리고 나머지 저주파 성분으로만 이미지를 저장시켜서 이미지의 용량을 줄이는 과정을 해보았다. 이는 실제로 JPEG 압축에서 쓰이는 방식이라고 하고 이미지를 보통 8*8로 잘라서 압축한다고 한다.
Haar Matrix를 만들기 위해서 다음의 URL를 참고 했다.
stackoverflow.com/questions/23869694/create-nxn-haar-matrix
#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 |