컴퓨터과학 (데이터 압축)


컴퓨터나 스마트폰을 구매할 때 메모리나 용량을 따지기 시작한 것은 그리 오래된 일이 아닙니다. 특별히 우리는 모바일 장비를 구매할 때나 저장용도로 장비를 살 때 이 점을 많이 따집니다. 요즘에는 많은 정보가 인터넷상에서 나오기 때문에 개발자들은 계속해서 용량을 줄여서 용량이 다 차지 않게 만들거나 비싼 데이터 요금이 나오지 않게 주의를 기울여서 장비를 만듭니다.


정보를 압축하는 방법은 몇 가지가 있습니다. 문장을 압축한다면, 3D나 DNA와 같이 머리글자를 축약해도 되고, TTYL, assoc, orig, gov과 같이 약어를 쓸 수 있습니다. 매우 좁은 공간에서 의사소통하기 위해 사용되는 아레시보 메시지를 참고해보세요. 그림은 천마디의 말과 같습니다. 이미지는 복잡한 상황과 감정에 관한 중요한 정보를 확실하게 전달합니다.


우리는 웹페이지나 소셜 네트워크나 메시지를 주고 받을 때 이미지를 사용합니다. 이럴게 할 때 정보를 업로드하거나 다운로드하는 과정이 필요합니다. 이 과정은 이미지나 영상의 크기와 질에 따라 오랜시간이 걸리기도 하고, 데이터 비용이 발생하기도 합니다. 따라서 텍스트나 이미지나 영상을 포함하는 미디어를 사용하는 소프트웨어를 개발할 때는 사용자가 다운로드하거나 인터넷상에서 볼 때 사용되는 데이터 양을 얼마로 줄 것인가가 결정적입니다.


이미지는 화소(픽셀)들의 집합으로 화면에 표시됩니다. 이미지에 있는 화소는 데이터의 부분(비트)입니다. 이미지의 용량을 줄이기 위해서 비트마스크가 사용되기도 합니다. 아래를 보시면 두 개의 이미지가 보이죠. 두 개는 서로 동일하게 보입니다. 그리고 이미지를 디바이스에 다운할 때 필요한 데이터의 양이 얼마인지를 가리키는 숫자가 매겨져 있습니다. 사실 아래 두 이미지는 같습니다. 왜냐하면 이미지를 보여주는데 아무런 압축도 하지 않았기 때문입니다.

(원본과 소스는 원 영문 페이지에서 보실 수 있습니다.)

비트 마스크는 화소의 크기를 보여주는데 약간의 논리를 사용합니다. 이 논리는 '&(그리고)비트마스크'논리를 사용하는데, 양쪽 비트가 모두 1일 경우에만 1이 되게 하는 논리입니다. 26번째 비트마스크를 0xFFFFFFFF에서 0xFF000000로 바꾼 후에 재생버튼을 눌러서 코드를 다시 실행해 보세요.

참고 : 첫 번째 FF는 화소의 투명도를 조절하는 비트입니다. 따라서 이 활동에서는 무시해도 됩니다. 결과를 보기위해 투명하게는 조절하지 않고 완전 불투명한 상태에서 진행하겠습니다. 처음에 나온 Ox는 16진수를 나타냅니다.


배경지식

2진수와 16진수로 화소수 나타내기

0xFF000000를 비트마스크로 작업하면 적색, 녹색, 청색은 모두 0로 설정됩니다. 다시 말해 비트마스크를 적용하면 각 비트는 0으로 결정되어 결국 모든 색 정보는 남아 있지 않게 되어 아무것도 보이지 않게 됩니다. 왜냐하면 2진수 비트마스크 작동결과 둘 모두가 1이여야 1로 남기 때문입니다. 0과 0이면 0으로, 0과 1이여도 0으로 되게 됩니다. 마지막에 남는 이미지는 결국 그것이 이미지였다는 것을 보여주는 비트를 포함하는 아무것도 없는 검정색 이미지입니다.

만일 비트마스크를 다시 처음 상태인 0xFFFFFFFF로 바꾼다면 원래 정보와 비교할 때 전혀 차이가 없을 것입니다. 왜냐하면 이미지의 크기가 원래 이미지와 같기 때문입니다. 처음 활동에서 이미지에 변동이 없었던 이유와 같습니다.



지금까지 두 가지 극단적인 상황을 제시했습니다. 한 가지는 0xFF000000가 비트 마스크로 적용되어 아무 비트도 비트마스크를 통화하지 못해서 메모리의 큰 삭감이 일어나는 경우였습니다. 비트마스크에 통과한 비트가 없어서 이미지의 질과 정보를 감소시키여 메모리의 차지하는 용량의 큰 삭감을 가져왔습니다. 다른 경우는 0xFFFFFFFF를 비트 마스크에 적용시키면 모든 비트가 메모리 용량의 감소없이 통과됨을 보았습니다.


이제 여러분이 원하는 비트마스크의 값으로 변경해서 다른 조합을 만들어 봅시다. 메모리 크기와 품질 사이의 최적의 절충된 값이 얼마정도되는지 결정하기 위해 패턴을 찾아보세요. 바비트 마스크의 값을 변경하여 자신에 대한 몇 가지 다른 조합을 시도합니다. 당신은 메모리 크기와 품질 사이의 최적의 절충이 무엇인지에 대한 결정을 내릴 수 있도록하는 패턴을 찾기 위해 노력하고 있습니다. 혹시 2진수와 16진수를 서로 변환하기 원하면 진수변환기를 인터넷에서 검색해서 사용하면 됩니다.


몇가지 조합을 시도하면서 패턴을 살펴보았습니까? 용량을 많이 줄이면서 이미지 크기를 줄이지만 우수한 품질을 보장해주는 비트마스크를 찾았습니까? 아래 표는 아마도 여러분이 시도했을만한 조합을 보여줍니다. 메모리 결과를 기억하면서 품질의 규모를 1부터 10까지 작성케 합니다. 비트마스크값을 바뀐 후에 [재생]을 눌러서 코드를 다시 실행시킵니다.



어떤 비트마스크 값이 좋았습니까? 아니면 제시한 값보다 더 좋은 값을 찾으셨나요?


그림의 품질은 사람에 따라 다를 수 있지만, 어떤 이 표에 나온 비트마스크 값들에게 어떤 패턴을 찾으셨나요? 품질은 유지하면서 정보의 양을 줄이는 이러한 패턴들이 어떻게 만들어 졌고 무엇을 줄여서 만들어졌는지를 다른 사람에게 설명하실 수 있나요?


친구에게 사진을 보내는 소프트웨어를 만든다고 한다면, 사진을 현상할 때의 품질보다, 다른 품질이 필요할 것입니다. 위 프로그램의 2번째 줄에 있는 사진이 있는 인터넷 주소를 바꿔서 다른 형태의 사진을 넣어보세요. 검정 단색 그림이나 흰색 단색 그림도 넣어보세요. 이런 일반적인 원리를 알게되면 알고리즘을 만드는 능력이 더 발전되며 자신이 필요한 적정점이 무엇인지 잘 판단하게 해줍니다.


위 활동에서 컴퓨팅 사고력을 비트마스트를 적용해서 용량이나 품질이 바뀌는 패턴을 찾는데 이용했습니다. 이러한 패턴들은 비트마스크를 사용해서 이미지의 크기를 줄이려고 할 때 일반적인 규칙을 개발하게 도와줍니다. 이 주제에 대해서 더 관심이 있다면 아레시보 메시지, 비트마스크, 비트맵, 색상 양자화, 포스터화, 디더링(떨리게함), 미디어 계산, CS언플러그드활동을 검색하세요. CS언플러그드 활동은 문장 줄이기 활동도 있습니다. 학생과 함께 이 활동을 하시려면 교육기준을 참고하세요.