카메라나 전자현미경 등의 장비를 이용해 우리가 관찰하는 사물이나 장면을 샘플링(sampling)과 양자화(Quantization)과정을 거쳐 디지털 영상으로 만들 수 있음을 지난 포스팅에서 배웠다. 이번 포스팅에선 디지털 이미지가 실제로 어떤 식으로 표현이 되는지를 알아보고, 디지털 영상이 차지하는 메모리의 크기를 계산하는 법을 알아보도록 하자.
1. 디지털 이미지의 표현 방법
디지털 이미지는 자연계에 존재하는 어떤 사물, 혹은 장면을 이미지 센서를 통해 디지털 값들의 집합으로 표현한 것이다. 이 과정에서 아날로그 신호인 대상체의 빛의 패턴을 샘플링(sampling)과 양자화(quantization)를 통해 전기 신호로 바꾸고, 최종적으로 전압값을 이진수로 바꾸어 메모리에 저장한다. 데이터를 표현하는 가장 간단한 형태는 이러한 이진수(binary number)이며, 이 이진수들을 여러개 붙여서 그 조합을 통해 흑백 영상, 컬러 영상등을 표현한다. 가장 간단한 형태의 디지털 이미지인 바이너리 이미지(binary image)부터 컬러 영상까지 디지털 이미지가 실제로 어떻게 표현되는지를 살펴보자.
그보다 앞서 디지털 이미지를 표현하는 데이터 뭉치가 컴퓨터안에서 어떠한 방식으로 표현되는지를 살펴보도록 하자.
- 디지털 이미지의 좌표계(Digital Image Coordinate)
외부의 어떤 장면이 카메라 렌즈를 거쳐 디지털 이미지로 형성이 되기 까지 몇 가지 좌표계를 거치게 된다. 잠깐 언급만 하자면 월드 좌표계(World coordinate), 카메라 좌표계(Camera coordinate), 이미지 좌표계(Image coordinate) 그리고 마지막으로 픽셀 좌표계(Pixel coordinate)가 있다. 이번에 우리가 살펴볼 좌표계는 이 픽셀 좌표계이다. (나머지 좌표계는 추후에 Multiple view geometry관련 포스팅을 할 때 언급하도록 하겠다.)
이미지를 이루는 가장 작은 단위를 픽셀(pixel)이라 하는데, 이미지를 이루는 점들이라고 생각하면 된다. 우리가 보통 모니터 해상도를 이야기 할 때 640x480, 1024x768등의 해상도를 많이 들어봤을 것이다. 이 해상도는 바로 픽셀(pixel)의 개수를 의미한다. 즉 640x480의 경우엔 아래 그림과 같이 가로 640개, 세로 480개의 픽셀로 이루어진 이미지를 의미한다. 이때 이미지의 총 픽셀 개수는 640x480=307,200개 이다.
위의 이미지에서 각 픽셀은 밝기 값, 혹은 컬러 값을 가지고 있는데, 이들 각각이 모여서 하나의 이미지 패턴을 만드는 것이다. 이때 각 픽셀들이 이미지를 형성하기 위해선 어떤 기준이 필요하다. 바로 이미지(픽셀) 좌표계(image coordinate)이다. 이미지 좌표계는 우리가 기존에 수학책에서 배웠던 좌표평면의 기준과는 좀 다른데, y축이 아래 방향이다. 따라서 y의 아래쪽 방향이 +방향, 위쪽이 -방향이 된다.
이미지 좌표는 선형대수의 행렬(matrix)과 같이 생각할 수 있다. M개의 row와 N개의 column을 가진 M x N 행렬을 생각해보자. 여기서 M을 y축의 크기, N을 x축의 크기로 생각한다면 아래와 같이 각 픽셀의 값을 접근할 수 있다. 보통의 함수 f(x,y)에서 x와 y가 뒤집힌 꼴이라고 생각하면 된다.
이러한 픽셀 접근 방법을 실제로 MATLAB으로 이미지를 띄워 확인해 보았다. 아래 그림은 M=258, N=350인 크기의 이미지의 좌표를 확인한 것이다. MATLAB의 데이터 커서 툴을 이용하여 임의의 좌표의 픽셀 값을 확인해 보았고, (x=137, y=29)좌표의 밝기 값이 127인 것을 확인하였다.
- 이진 영상(binary image)
디지털 이미지중 가장 간단한 형태는 이진 영상(binary image)이다. 이진 영상은 각 픽셀이 1비트(bit)로 이루어져 있으며 각 픽셀은 오직 밝음(=1), 어두움(=0)의 두 가지 만을 표현한다. 쉽게 말해 각 픽셀에 LED를 달아 놓은 형태를 생각하면 된다. LED가 켜져 있으면 그에 해당하는 픽셀은 1, 꺼져 있으면 0이라고 생각하면 된다. 아래 그림은 이진 영상을 나타낸 것이다.
사과 그림을 이진 이미지로 바꾸어 출력한 것이다. 왼쪽의 빨간색 박스 안의 실제 픽셀 값들을 오른쪽에 나타내었다. 0과 1로만 픽셀 값들이 이루어진 것을 볼 수 있다.
사실 바이너리 이미지를 만드는 방법은 두 가지가 있는데 첫 번째는 원하는 포인트에 점을 찍어 만드는 방법이 있다. 두 번째는 기존의 흑백 영상으로부터 임계값(threshold)을 기준으로 만드는 방법이 있다. 이때 임계값은 0~255 사이의 값 중 하나를 지정하게 되는데, 기본적으로 128을 많이 사용한다. 즉 128보다 작은 픽셀 값들은 0으로, 큰 픽셀 값들은 1로 만드는 방법이다. 이 외에도 이중 임계값으로 만드는 방법 등 다양한 방법이 존재한다. 이후 포스팅에서 자세히 다루도록 하겠다.
이러한 바이너리 이미지는 Image segmentation, Object Detection 등 다양한 영상처리 기법의 한 과정으로 응용된다. 이진 이미지가 실제 응용된 예로는 Monochrome OLED Display가 있다.
이진 이미지로 표현된 Monochrome OLED display
- 흑백 영상(gray-scale image)
흑백 영상은 각 픽셀의 밝기 값을 0~255사이의 값으로 표현한 이미지이다. 이는 8bit=1Byte의 메모리를 사용한 것이며 아래 그림은 똑같은 사과 영상을 8bit의 흑백 영상으로 표현한 것이다.
왼쪽의 빨간색 박스 안쪽의 픽셀의 밝기값들을 오른쪽에 출력하였다. 픽셀 값들의 범위가 0~255사이의 값인 것을 볼 수 있다. 픽셀의 밝기 값들을 어느 범위에서 표현할지에 따라 흑백 영상의 모습이 약간씩 달라진다. 가장 작은 범위로 표현한 영상이 바이너리 이미지(0~1사이의 값으로 밝기를 표현)라고 할 수 있으며 가장 큰 값으로 표현한 범위가 0~255인 8bit로 표현한 흑백 영상이다. 밝기의 범위에 따른 흑백 이미지의 모습은 바로 이전의 포스팅인 이미지 샘플링과 양자화에서 후반부를 보면 자세히 나와있다.
대부분의 영상처리 알고리즘은 이 흑백 이미지에서 처리 된다. 심지어는 딥러닝을 통한 얼굴 인식 등에도 컬러 영상이 아닌 흑백 영상이 학습 데이터로써 이용된다.
다음에 설명할 컬러 이미지는 표현방법이 약간 복잡하기 때문에 영상 처리를 적용하기가 까다롭고 복잡하다.
- 컬러 영상(color image)
컬러 영상은 3개의 채널로 표현된다. 이때 3개의 채널은 빛의 3원색인 빨강(Red), 녹색(Green), 파랑(Blue)이다. 각 채널은 0~255사이의 값으로 빨강의 정도, 녹색의 정도, 파랑의 정도를 각각 나타낸다.
컬러 영상에서는 세 개의 기본 컬러를 조합하여 다양한 색깔을 만들어낼 수 있는데 각각의 8bit의 기본 컬러 3개를 조합하여, 256 x 256 x 256 = 16,777,216가지의 컬러를 만들어낼 수 있다. 8bit(red, green, blue) 3개를 조합하여 총 24bit를 이용하여 컬러를 표현했으며 이를 트루 컬러(True color)라 부른다. 여러 이미지나 그래픽 관련 프로그램들은 RGB 채널에 투명도(Transparent)를 나타내는 Alpha채널을 더하여 RGBA인 32bit컬러 모델을 많이 사용한다.
아래 그림은 위의 사과 영상을 컬러 이미지로 표현한 것이다.
원래의 빨간 사과 컬러 이미지를 R(Red, )G(Green), B(Blue)의 각 채널별 이미지로 표현하였다. 보다시피 사과는 빨간색인데, 세 개의 채널 중 Red 채널이 가장 밝은 것을 볼 수 있다. 가장 밝다는 것은 높은 값들이 많이 분포해 있다는 의미이며, 이는 색깔이 빨간색일 확률이 높은 것이다. 실제로 위 이미지의 (x=163, y=116)인 좌표의 RGB값들은 R=180, G=2, B=2 이다. 따라서 이 좌표의 픽셀의 색깔은 빨간색에 가깝다.
컬러 이미지는 다양한 컬러 모델로 표현할 수 있다. 가장 기본적인 형태인 RGB모델, HSV(Hue, Saturation, Intensity)모델, YCbCr모델 등 다양한 컬러 모델이 존재한다. 컬러 모델에 대한 자세한 사항은 추후에 컬러 영상에 대한 포스팅을 할 때 이야기 하도록 하겠다.
2. 디지털 이미지의 메모리 계산법
디지털 이미지는 기본적으로 컴퓨터를 이용하여 보여지고 처리되는 데이터 집합이다. 이는 반드시 메모리에 저장이 되어야 하는데, 이번엔 디지털 이미지가 차지하는 메모리를 계산하는 방법을 알아보도록 하자.
디지털 이미지는 기본적으로 2차원 배열 형태를 띄고 있다. 배열의 각 원소는 하나의 메모리 공간을 나타내며 보통 1Byte의 공간을 차지한다. 따라서 이미지의 가로(width)와 세로(height)의 크기의 곱에 각 픽셀이 차지하는 비트수(bits)를 곱해주면 메모리에서 차지하는 공간이 나오게 된다. 이때 비트수는 8로 나누어줘야 하는데 이는 1Byte=8bit 이므로 bit를 Byte로 바꾸어 주기 위함이다.
흑백 이미지일 경우 bit수는 8bit가 사용되므로 1Byte이다. 8bit가 사용되는 이유는 부호가 없는 경우 8bit를 사용하여 0~255의 숫자를 표현할 수 있기 때문이다. (부호가 있을 경우 보통 맨 앞의 bit인 MSB(most significant bit)를 부호로 사용하고 0~127사이의 숫자를 표현함)
위에서 사용했던 사과 이미지를 예로 들어보자. 사과 이미지는 가로(width)가 420, 세로(height)가 288이며 24bit를 사용한다.
컬러 이미지의 경우에 그 크기가 아래와 같다.
Apple Color Image(24bit):
362,880 Byte = 420 x 288 x (24/8)
약 360 Kilo Byte의 메모리 공간을 차지하는 것을 볼 수 있다. 다음은 흑백 이미지를 계산해보자.
Apple Gray-scale Image(8bit):
120,960 Byte = 420 x 288 x (8/8)
메모리 크기가 약 1/3로 줄어든 것을 볼 수 있다. 마지막으로 바이너리 이미지를 계산해보자.
Apple Binary Image(2bit):
30,240 Byte = 420 x 288 x (2/8)
바이너리 이미지가 차지하는 메모리 공간은 단 2bit만 사용하기 때문에 훨씬 작은 것을 볼 수 있다. 그러나 바이너리 이미지도 대부분은 흑백 이미지와 같이 픽셀당 1Byte로 표현하기 때문에 흑백 이미지와 같은 크기의 메모리를 차지한다.
위에서 보인 메모리 계산법은 이미지의 확장자가 *.BMP(bitmap)일 때의 계산법이다. 또한 실제로는 위의 계산된 크기보다 약간 더 크다. 이는 BMP이미지의 포맷을 정의하기 위한 헤더나 색깔을 지정하기위한 팔레트(Palette)등의 정보가 이미지에 추가 되기 때문이다. 인터넷에서 BMP확장인 이미지를 다운 받아 크기를 계산하여 확인해보자.
이 외에도 Jpg, png등 많은 이미지 포맷이 존재한다. 나머지 이미지 포맷은 사람이 느낄 수 없을 정도로 이미지를 압축하여 저장하기 때문에 용량이 훨씬 작다. 위의 apple 이미지의 BMP포맷은 약 360KB의 크기이지만, 이를 jpg로 바꿨을 경우 약 20KB로 용량이 줄어든다.
이미지 압축도 손실 압축, 무손실 압축 등 방법이 다양하다. 기존의 jpg방식은 손실 압축 방식을 사용하여 아주 미세하게 화질의 차이가 존재하지만 일반사람들은 구분하기 힘들다. 개선된 jpg나 png포맷은 무손실 압축 방식을 사용하고 용량도 훨씬 작은 장점이 있다.
'Image Processing' 카테고리의 다른 글
이미지 샘플링(sampling)과 양자화(quantization) (3) | 2017.01.02 |
---|---|
Digital Image Fundamentals #이미지 센싱과 획득 (0) | 2016.12.25 |
Digital Image Fundamentals #빛과 전자기 스펙트럼(Electromagnetic Spectrum) (0) | 2016.12.11 |
Digital Image Fundamentals #시각 인지의 요소 (3) | 2016.11.28 |
Introduction#디지털 영상 처리를 활용하는 분야의 예시 (0) | 2016.11.12 |