일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- chatGPT
- 선택정렬
- Proof Selection Sort
- haar matrix
- Binary Search Proof
- binary search
- Selection Sort
- 선택정렬 증명
- 이진탐색 증명
- GPT-3
- 이진탐색
- ChatGPT 설명
- Discrete Wavelet Transform
- BERT
Archives
- Today
- Total
Just Do IT
이미지 압축 (Image Compression) - Haar Matrix 구현 (3) 심화 본문
Haar Matrix를 반으로 나누면?
Haar Matrix를 위와같이 또 Hl과 Hh로 나눠보면
이렇게 표현할 수 있다.
해당 식들은 이렇게 서로 변형이 가능하다.
위의 식을 풀어 쓰면 이렇게 되는데 이번 포스팅에서는 +로 나눠진 각각의 식을 이미지화 해보려고 한다.
- 배열의 이미지화를 위한 함수 정의
def AreMatrix(h):
Are = []
for i in range(imgHeight):
lst = []
for j in range(imgWidth):
lst2 = []
for z in range(3):
lst2.append(h[i,j])
lst.append(lst2)
Are.append(lst)
return np.array(Are, dtype = 'u1')
함수를 정의했다. 전 포스팅에서 사용했던 알고리즘을 함수화 했다.
- Hl과 Hh 구하기
Hl = normHT[:int(imgHeight/2),:]
Hh = normHT[int(imgHeight/2):,:]
Hl과 Hh를 normHT 행렬을 반으로 나누어 정의했다.
- 식 구하기
# 1. Hl^T * Hl * A * Hl^T * Hl
one = Hl.T @ Hl @ A @ Hl.T @ Hl
# 2. Hl^T * Hl * A * Hh^T * Hh
two = Hl.T @ Hl @ A @ Hh.T @ Hh
# 3. Hh^T * Hh * A * Hl^T * Hl
three = Hh.T @ Hh @ A @ Hl.T @ Hl
# 4. Hh^T * Hh * A * Hh^T * Hh
four = Hh.T @ Hh @ A @ Hh.T @ Hh
numpy의 mulmat 함수는 @로 대체할 수 있다.
- 배열의 이미지화
oneAre = AreMatrix(one)
twoAre = AreMatrix(two)
threeAre = AreMatrix(three)
fourAre = AreMatrix(four)
Image.fromarray(oneAre).show()
Image.fromarray(twoAre).show()
Image.fromarray(threeAre).show()
Image.fromarray(fourAre).show()
해당 이미지를 나타내면 다음과 같다.
- Hll,Hlh 구하기
Hl을 또 다시 반으로 나누어 Hll과 Hlh를 구할 수 있다.
Hll = Hl[:int(Hl.shape[0]/2),:]
Hlh = Hl[int(Hl.shape[0]/2):,:]
- 식 구하기
# 5. Hll^T * Hll * A * Hll^T * Hll
five = Hll.T @ Hll @ A @ Hll.T @ Hll
# 6. Hll^T * Hll * A * Hlh^T * Hlh
six = Hll.T @ Hll @ A @ Hlh.T @ Hlh
# 7. Hlh^T * Hlh * A * Hll^T * Hll
seven = Hlh.T @ Hlh @ A @ Hll.T @ Hll
# 8. Hlh^T * Hlh * A * Hlh^T * Hlh
eight = Hlh.T @ Hlh @ A @ Hlh.T @ Hlh
- 배열의 이미지화
fiveAre = AreMatrix(five)
sixAre = AreMatrix(six)
sevenAre = AreMatrix(seven)
eightAre = AreMatrix(eight)
Image.fromarray(fiveAre).show()
Image.fromarray(sixAre).show()
Image.fromarray(sevenAre).show()
Image.fromarray(eightAre).show()
해당 이미지를 나타내면 다음과 같다.
해당 그림마다 상하나 좌우 아니면 상하좌우 픽셀의 차이가 나타나는 특색이 다르다. 솔직히 아직 이런 것들이 어디에 쓰이는지는 잘 모르겠다. 그림의 윤곽선을 알 수 있게 해주는 느낌이긴 한데.. 머신러닝이나 딥러닝 쪽을 공부하다 보면 의문이 풀릴 것이라고 생각한다.
이 프로젝트로부터 정말 얻은 것이 많다. C언어로 넘파이 같은 라이브러리 없이 모든걸 구현하느라 엄청나게 많은 시간을 오류랑 싸웠다.. 그래도 이렇게 복습을 하면서 생각을 정리할 수 있게 돼서 기쁘다.
마지막으로 이 글을 읽는 학생분들 중에 교수님이 파이썬으로 과제를 내주셔서 이 포스팅들이 문제가 되면 바로 알려주시면 비공개 조치 하도록 하겠습니다. 저처럼 C로 구현하게되면 제 포스팅이 좋은 힌트가 됐으면 좋겠습니다.
'데이터사이언스-기초수학 > 선형대수학' 카테고리의 다른 글
이미지 압축 (Image Compression) - Haar Matrix 구현 (2) (numpy, PIL, pylab) (0) | 2022.02.02 |
---|---|
이미지 압축 (Image Compression) - Haar Matrix 구현 (1) (0) | 2022.02.02 |
Comments