티스토리 뷰

development

RLE란 무엇인가? (feat. Notion AI)

주먹불끈 2023. 4. 24. 00:19

개요

RLE라는 개념을 알게 되었다. 이미지의 마스크를 서버간 통신으로 전달할 때에 용량을 줄일 수 있다고 한다. 기존 방식으로 정리를 한다면 구글링부터 하고 정보들을 모아서 정리하였겠지만 이번에는 노션의 AI 기능을 적극 활용해 보았다. 작성을 하고 드는 생각은

  1. 내가 직접 쓰는 것보다 훨씬 세련되게 작성이 된다.
  2. 이렇게 작성할 수 있게 된 시대에 블로그 포스팅은 어떤 의미를 가지게 되는가?
  3. 블로그 포스팅에서는 존칭을 안쓰려 하는데 존칭으로 작업이 된다

RLE란?

RLE은 **"Run Length Encoding"**의 약자로, 이미지나 비디오 데이터를 압축하는 데 사용되는 압축 알고리즘 중 하나입니다. 이 알고리즘은 이미지에서 연속된 픽셀 값이 반복되는 경우, 그 값을 반복되는 횟수와 함께 저장하여 데이터를 압축합니다. 이를 통해 데이터 용량을 줄일 수 있습니다.

RLE 알고리즘 다이어그램

알고리즘 자체는 간단하다. 11111000 이라면 1이 5개, 0이 3개이니 1503인 것이다.

실제 구현

실제로 적용할 때에는 다음의 단계를 생각할 수 있다.

  1. 마스크 이미지를 바이너리 값으로 변환한다.
  2. 위에 언급한 RLE 방식으로 값을 변환한다.
  3. 이를 zlib로 한 번 더 압축한 다음
  4. 바이너리를 통신 전송하기 위해 base64로 변환한다.

다음 코드는 위 내용을 Notion AI에게 Golang으로 예시를 보여달라 요청한 것이다.

func main() {
	// assume mask is a 2D boolean array
	mask := [][]bool{
		{true, true, false},
		{false, true, false},
		{false, false, true},
	}

	// encode mask using RLE
	var buf bytes.Buffer
	var count int32
	var value bool
	for _, row := range mask {
		for _, pixel := range row {
			if pixel == value {
				count++
			} else {
				binary.Write(&buf, binary.BigEndian, count)
				buf.WriteByte(byte(value))
				count = 1
				value = pixel
			}
		}
	}
	binary.Write(&buf, binary.BigEndian, count)
	buf.WriteByte(byte(value))

	// compress using zlib
	var compressed bytes.Buffer
	writer := zlib.NewWriter(&compressed)
	writer.Write(buf.Bytes())
	writer.Close()

	// encode using base64
	encoded := base64.StdEncoding.EncodeToString(compressed.Bytes())

	fmt.Println(encoded)
}
반응형
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함