Just Do IT

이미지 압축 (Image Compression) - Haar Matrix 구현 (3) 심화 본문

데이터사이언스-기초수학/선형대수학

이미지 압축 (Image Compression) - Haar Matrix 구현 (3) 심화

풀용 2022. 2. 3. 00:26

Haar Matrix를 반으로 나누면?

Haar Matrix를 위와같이 또 Hl과 Hh로 나눠보면

이렇게 표현할 수 있다.

해당 식들은 이렇게 서로 변형이 가능하다.

위의 식을 풀어 쓰면 이렇게 되는데 이번 포스팅에서는 +로 나눠진 각각의 식을 이미지화 해보려고 한다.

  1. 배열의 이미지화를 위한 함수 정의
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')

함수를 정의했다. 전 포스팅에서 사용했던 알고리즘을 함수화 했다.

  1. Hl과 Hh 구하기
Hl = normHT[:int(imgHeight/2),:]
Hh = normHT[int(imgHeight/2):,:]

Hl과 Hh를 normHT 행렬을 반으로 나누어 정의했다.

  1. 식 구하기
# 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 함수는 @로 대체할 수 있다.

  1. 배열의 이미지화
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()

해당 이미지를 나타내면 다음과 같다.

oneAre
twoAre
threeAre
fourAre

  1. Hll,Hlh 구하기
    Hl을 또 다시 반으로 나누어 Hll과 Hlh를 구할 수 있다.
Hll = Hl[:int(Hl.shape[0]/2),:]
Hlh = Hl[int(Hl.shape[0]/2):,:]
  1. 식 구하기
# 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
  1. 배열의 이미지화
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()

해당 이미지를 나타내면 다음과 같다.

fiveAre
sixAre
sevenAre
eightAre

해당 그림마다 상하나 좌우 아니면 상하좌우 픽셀의 차이가 나타나는 특색이 다르다. 솔직히 아직 이런 것들이 어디에 쓰이는지는 잘 모르겠다. 그림의 윤곽선을 알 수 있게 해주는 느낌이긴 한데.. 머신러닝이나 딥러닝 쪽을 공부하다 보면 의문이 풀릴 것이라고 생각한다.

이 프로젝트로부터 정말 얻은 것이 많다. C언어로 넘파이 같은 라이브러리 없이 모든걸 구현하느라 엄청나게 많은 시간을 오류랑 싸웠다.. 그래도 이렇게 복습을 하면서 생각을 정리할 수 있게 돼서 기쁘다.

마지막으로 이 글을 읽는 학생분들 중에 교수님이 파이썬으로 과제를 내주셔서 이 포스팅들이 문제가 되면 바로 알려주시면 비공개 조치 하도록 하겠습니다. 저처럼 C로 구현하게되면 제 포스팅이 좋은 힌트가 됐으면 좋겠습니다.

Comments