앞선 포스팅에서 우리는 이미지를 획득하는 다양한 방법에 대해 배웠다. 그러나 이렇게 다양한 이미지 획득 방법들의 최종 목적은 같다. 바로 센싱된 데이터들로부터 디지털 이미지를 만들어내는 것이다. 

대부분의 센서 데이터들은 센싱된 장면(scene)에 관련된 연속적인 전압의 파형(continuous voltage waveform)이며, 해당 장면의 특성은 파형의 진폭(amplitude)의 패턴으로 표현된다. 센싱된 전압 파형으로부터 디지털 이미지를 만들어내기 위해선 이러한 연속된 파형을 디지털 형식으로 바꿔야 한다. 연속된 파형을 얻는 과정, 디지털 형식으로 바꾸는 과정을 각각 샘플링(sampling)양자화(quantization)라 한다. 이번 포스팅에선 샘플링과 양자화에 대해 알아보도록 하겠다. 

 

 

 

1. 샘플링(sampling)과 양자화(quantization)의 기본 개념

 

- 샘플링(sampling)의 기본 개념 

 

샘플링(sampling)이라는 것은 기본적으로 수 많은(무한한) 데이터들 가운데 유한한 개수의 데이터를 뽑아내는 것이다. 

가령 속이 보이지 않는 어떤 상자에 10,000개의 공을 넣어 놓고 상자속 공의 색깔에 대한 분포를 추정한다고 생각해보자. 모든 공을 전부 뽑아서 조사하면 가장 정확하겠지만 시간과 비용이 너무 많이 든다. 따라서 10,000개의 공 중에 1000개만 뽑아낸다고 했을 때, 공을 뽑아내는 행위 자체를 샘플링이라고 한다. 

 

즉 어떤 모집단 전체의 데이터를 전부 사용하면 가장 정확하겠지만 시간과 비용이 많이 소모되기 때문에 적당한 개수의 데이터만 뽑아서 전체의 패턴을 추정하기 위한 데이터 수집 행위라고 할 수 있다. 

 

상자속 공의 샘플링말고 실제 1차원 신호를 예로 들어보자. 

 

녹음기 하나를 떠올리고, 이 녹음기에 어떤 대화를 녹음하는 것을 상상해보자. 이때 우리가 말하는 내용은 음성 신호(voice signal)로써 특정 파형(waveform)의 형태를 보일 것이다. 아래 그림을 실제 아날로그 음성 신호라고 가정해보자. 

 

 

 

 

 

가로축은 시간(time), 세로축은 진폭(amplitude)를 나타낸다. 

여기서 샘플링이라는 것은 어떤 것을 의미할까? 바로 일정한 간격의 주기로 신호의 강도를 수집하는 것을 의미한다. 이때 중요한 것은 어느 위치, 혹은 어느 시간에 진폭값이 얼마인지를 알아내는 것이다. 여기에 추가로 샘플링 주파수(sampling frequency)도 굉장히 중요하다. 원래 신호 모양을 온전히 복원하기 위해선 나이퀴스트 샘플링 주파수(Nyquist Sampling frequency) 규칙을 따라야한다. 이에 대한 내용은 본 포스팅 범위를 벗어나므로 패스하겠다. 구글에 검색하면 관련된 많은 자료가 있으니 참고하기 바란다. 

 

 

자 이제 위의 신호를 샘플링 해보자. 아래 그림에서 빨간 줄이 샘플링 지점(sampling point)라고 생각하면 된다. 즉 시간의 단위를 초(second)라고 했을 때 1초 때의 신호의 강도를 수집하여 저장하고 2초때 신호 강도를 수집해 저장하는 식으로 신호를 수집하는 것이다. 아래 그림은 위 신호의 샘플링 과정을 나타낸 모습이다. 

 

위의 점들을 직선으로 이어보자. 원래의 신호와 비교 했을 때 비슷한가? 아닐 것이다. 좀 더 촘촘하게(짧은 주기, 높은 주파수로) 샘플링을 할 수록 원래 신호에 가까워진다. 

 

 

 

샘플링 과정을 보면 매 샘플링 주기 T(여기선 1초로 가정)마다 신호의 강도(amplitude)를 측정하여 그 값을 저장한다. 위 그림의 아래는 샘플링 결과를 나타낸다. 

 

샘플링 주기가 짧을 수록 원래의 신호를 더 잘 복원할 것이다. 그러나 반대로 샘플링을 위해 더 많은 연산을 해야 하므로 샘플링 비용이 증가하고 이에 따른 부담이 커진다는 단점이 있다. sampled signal의 그림을 보면 매 샘플링 시간 마다 그 시간 위치에서의 진폭값(amplitude)이 빨간색 점으로 표현되어 있다. 이 점들을 차례로 연결시키면 원래의 신호 패턴이 복원될 것이다. 물론 앞서 언급했듯이 샘플링 주기가 짧을 수록, 이말은 곧 샘플링 주파수(sampling frequency)가 높다는 의미이며 샘플링 주파수가 높을 수록 원래의 신호에 더 가깝게 된다. 아래의 식과 같이 주기와 주파수는 역수의 관계임을 잘 생각하자. 

 

 

 

 

- 양자화(quantization)의 기본 개념

 

양자화(quantization)라는 것은 샘플링(sampling)한 아날로그 형태로 되어 있는 신호나 정보를 디지털화(digitizing) 하는 작업을 말한다. 좀 더 쉽게 말하자면 다음과 같다. 

 

0 ~ 1사이의 숫자를 생각해보자. 아날로그 방식으로 생각해보면 0과 1사이엔 실제로 무수히 많은 숫자가 존재한다. 0.1, 0.2479, 0.78001, 0.99999 등 우리가 셀 수 없이 많은 수가 무한대로 존재하는 것이다. 현실적으로 이 무수한 숫자들을 다루기란 불가능하기 때문에 우리는 일정한 범위와 기준값을 정해놓고 어떤 임의의 숫자가 나오면 그와 가장 근접한 기준값으로 만들어 사용하는 것이다. 

 

예를 들어 우리가 어떤 전압 값을 측정한다고 해보자. 이때 우리는 0.1V 단위로만 값을 측정한다고 가정해보자. 실제의 전압 값이 3.4122319800200922212935482...V 라고 했을 때 과연 이 값을 전부 표현하는것이 옳은가? 저렇게까지 정밀하게 측정하기도 어려울 뿐더러 그럴 만한 정밀한 센서도 없고 그럴 필요성도 없다. 이럴때 우리는 뒤에 필요 없는 정보는 생각하지 않고 측정된 값을 가장 근접한 값으로 만들어 사용하는 것이다. 

실제로 센서에 의해 측정된 아날로그 전압값이 3.41223V라고 했을 때 0.1V 단위로 측정한다고 했으니 이때의 양자화 시킨 Voltage값은 3.4V일 것이다. 

 

결국 양자화라는 것은 무한대로 이루어진 셀 수 없는 아날로그 정보를 셀 수 있을 만큼의 간격으로 만들어서 유의미한 정보만을 사용하는 것이다. 이 말은 샘플링에도 유효할 것이다. 

 

위에서 봤던 신호 샘플링의 그림을 다시 보자. 

 

t=2의 진폭 값과 t=4일 때의 진폭값은 눈으로 봤을 때 당연히 다르다. 그러나 0.1V단위로 양자화를 하게 되면 t=2와 t=4는 같은 전압값(0.2V)을 가지게 된다. 적절한 양자화의 Level설정이 필요하다. 

 

 

아까 수집한 전압 값을 0.1V 단위로 양자화 한다고 가정해보자. t=1일 때의 실제 측정된 신호의 진폭은 0.0973V이다. 양자화 과정을 통해 가장 가까운 값인 0.1V로 만들었고 결국 t=1일때의 신호 값은 0.1V가 된다. t=2 일때는 0.2V, t=3일때는 0.3V가 각각 되고 t=7일때는 -0.1V가 되는 것이다. 이렇게 하여 컴퓨터의 메모리에는 [0.1, 0.2, 0.3, 0.2, 0.3, ... ]의 값들이 배열의 형태로 순차적으로 저장된다.

 

그런데 위와 같이 0.1V단위로 양자화를 하게 되면 t=2일 때 0.2V가 되고 t=4일 때도 역시 0.2V가 된다. 눈으로 보기엔 분명 t=2와 t=4의 진폭값은 다르다. 그러나 양자화 결과 같은 값이 되는 것이다. 이때에 양자화 단계를 0.05V로 설정했다면 t=2와 t=4는 다른 진폭값으로 기억될 것이다. 따라서 적절한 양자화(quantization) Level 설정이 중요하다. 

 

 

 

2. 이미지의 샘플링(sampling)과 양자화(quantization)

 

- 이미지 샘플링(sampling)

 

우리는 지금까지 1차원 신호에 대한 샘플링과 양자화에 대한 개념을 공부하였다. 그렇다면 2차원인 이미지의 경우엔 샘플링과 양자화가 어떻게 이루어질까? 간단하다. 2차원 배열(2-D Array)형태의 센서를 이용해 영상 신호를 샘플링하고 양자화 하는 것이다. 2-D Array센서로는 대표적으로 CCD(Charge Coupled Device)와 CMOS(Complementary metal-oxide semiconductor)라는 센서가 있다. 두 센서에 대한 자료는 인터넷에 지나치게 많으니 자세한 설명은 생략하고.. 

 

간단히 얘기해서 빛 에너지를 전기신호로 바꾸는 센서이다. 즉 어떤 장면을 카메라로 촬영한다고 했을 때, 광원(태양 등)으로부터 나온 빛이 어떤 사물이나 환경에 다다른다. 이후 대상 물체에 반사된 빛 에너지들이 카메라 렌즈를 통과해 아래 그림과 같은 2-D Array 센서판에 다다르게 된다. 이때 센서 Array는 촬영한 장면에 대한 빛 에너지의 패턴대로 각 Cell에 일정 전압이 걸리게 되고 각 Cell에 대한 전압값은 양자화 과정을 통해 디지털 값으로 변환되어 메모리에 저장된다. 이 과정이 아래 그림에 나타나있다. 

 

 

 

 

카메라 안쪽에 위치한 2-D Array모습은 아래 그림과 같이 여러 개의 CCD 혹은 CMOS센서들이 촘촘하게 배열되어 있는 모습이다. 이때 빛의 3원색인 빨강, 초록, 파랑의 총 3가지 색깔의 빛 에너지를 흡수하는 센서들이 교차 배치되어 컬러 이미지를 형성하도록 한다. 각 센서는 해당 색깔만 통과시키는 필터가 있어서 해당 색깔 정보만 받아들이며, 이들의 컬러 조합으로 컬러 이미지가 만들어진다. 

 

 

 

Bayer pattern으로 불리는 2-D Array 센서. (이미지 출처: 위키 https://en.wikipedia.org/wiki/Bayer_filter)

 

 

 

그렇다면 2-D Array 센서가 이미지의 형성과 어떤 관계가 있을까? 2-D Array센서는 결과적으로 이미지의 품질(Quality)에 막대한 영향을 미치게된다. 2-D Array센서의 밀도가 높을수록, 즉 단위 면적당 센서의 개수가 많을 수록 이미지의 품질은 높아진다. 

우리는 흔히 디지털 카메라의 스펙을 이야기할 때 화소(picture element)를 이야기한다. 화소는 센서 Array 개개의 cell의 개수를 의미하는데, 예를 들어 1000만 화소라 하면 위 그림과 같은 센서 Array의 각 cell의 개수가 1000만개임을 뜻한다. 당연히 화소가 높을 수록 장면의 디테일한 부분까지 이미지에 표현되기 때문에 이미지의 품질에 큰 영향을 미친다. 카메라의 화소가 높다는 것은 결국 어떤 장면에 대한 빛의 패턴 신호를 높은 주파수(혹은 짧은 주기)로 샘플링 하는 것을 의미한다. 이와 관련하여 아래 그림을 참조 하여 이해를 해보자. 

 

 

 

센서 Array의 밀도에 따른 이미지 Quality. 왼쪽: 저밀도, 오른쪽 고밀도 센서 Array

꽃 이미지 출처: http://ccideas.com/chatter/high-resolution-images-vs-low-resolution-images-a-short-primer-for-beginners/

 

 

위 그림은 이미지 센싱을 위한 센서 Array의 밀도에 따른 이미지 품질을 나타낸 것이다. 왼쪽은 센서 Array의 밀도가 낮은 경우, 오른쪽은 고밀도 센서 Array를 이용해 이미지를 생성한 결과를 보여준다. 센서 밀도가 낮다는 것은 단위 면적당 각 Cell의 개수가 적은 것이고 그 만큼 촬영 대상 환경의 빛 에너지 패턴의 샘플링 주파수가 낮음을 의미한다. 

반대로 센서의 밀도가 높은 경우엔 단위 면적당 각 Cell의 개수가 많은 것이고 샘플링 주파수가 높기 때문에 원래의 이미지를 더 잘 복원하게 된다. 이때 한 cell에서 다음 cell까지의 거리를 샘플링 주기라고 생각하면 된다. 이러한 샘플링 과정이 x와 y축으로 동시에 존재하는 것이 2-D 센서 Array라고 생각하면 된다. 

 

그림의 아래쪽을 보면 dpi라고 표기된 부분은 dots per inch의 약자이며 1inch당 존재하는 정사각형(square)화소의 개수를 의미한다. 72 dpi는 1inch 길이의 라인에 존재하는 점이나 화소의 개수를 의미한다. 아래의 그림들은 dpi의 개념을 나타낸다. 

 

dpi별 이미지. 출처: http://www.tatge.biz/working-with-images-hi-res-vs-lo-res/

 

 

DPI(dots per inch)는 주로 프린터의 출력 분해능(resolution)을 표현하는데에 많이 사용되고 모니터나 이미지의 분해능(resolution)을 표현할 때는 PPI(pixels per inch)를 주로 사용한다. dpi에 따른 이미지를 잘 살펴보자. 

 

 

- 이미지 양자화(quantization)

 

이번에는 이미지의 양자화(Quantization)에 관해 알아보자. 

이미지 샘플링은 Array형태로 존재하는 이미지 센서를 통해 각 cell에 주사되는 빛 에너지의 양을 전압(voltage)으로 변환하여 저장하는 것을 의미한다. 이미지 양자화는 각 cell에서 변환한 전압값을 일정한 주기의 기준값에서 가장 근접한 디지털 값으로 매칭시키는 과정을 의미한다. 아래 그림을 보자. 

 

 

 

 

 

 

빛 에너지가 이미지 센서 Array에 다다르고, 빛의 강도와 파장에 따라 전압 값으로 변환된다. 여기 까지가 샘플링(sampling)단계이다. 이제 빛 에너지로부터 변환된 아날로그 전압값을 일정한 간격으로 나뉜 기준값들중 가장 가까운 값으로 matching이 이루어진다. 위의 양자화의 기본 개념 부분을 참고해보자. 결국 아날로그 전압값으로부터 적정 디지털 값으로 연결시키는 작업이 양자화(quantization) 단계이다. 이러한 기본적인 양자화 단계가 각 cell에 걸쳐 전반적으로 이루어지게 되고, 이를 통해 우리는 각 cell, 즉 이미지의 각 pixel에 대한 강도 값(intensity)을 얻을 수 있다. 

 

샘플링에서부터 양자화를 거쳐 최종적인 이미지를 얻기 까지는 굉장히 복잡한 단계를 거치게 된다. 이번 포스팅에서는 이 복잡한 과정중 샘플링과 양자화의 관점에서만 설명한 것이지 이면에는 굉장히 복잡한 과정들이 숨어있다. 

 

디지털 이미지의 양자화는 다양한 Level로 구성할 수 있다. 즉 전압값을 양자화할 때 몇 개의 간격으로 잘라서 디지털 값으로 매칭을 시킬지를 결정하는 것이다. 필자가 개인적으로 좋아하는 League of Legend의 베인 캐릭터 그림을 이용해 양자화 Level에 따른 결과이미지를 출력해 보았다. 쉬운 이해를 위해 흑백 이미지를 이용하여 구현하였다. 

 

 

L은 양자화의 Level을 의미하며 검은색으로부터 흰색에 이르는 밝기의 변화를 몇 단계로 자를지를 결정하는 것이다. L=4일 경우 4단계로 쪼개서 밝기 값을 표현하는 것이다. 흑백(gray-scale)영상에서 L은 2의 거듭제곱으로 표현되며 최대값은 256이다. 이는

을 의미하며 0~255까지의 밝기 값을 표현한다. 따라서 이미지의 한 pixel당 1Byte로 밝기 값을 표현한다. 

 

L=2인 이미지를 바이너리 이미지(binary image)라 부른다. 흑과 백 단 두 가지 밝기 값만을 이용해 이미지를 표현한 것이다. 이러한 바이너리 이미지는 영상처리에서 segmentation, 모폴로지 연산 등 특수한 상황에 사용되는 이미지이다. 

 

결과적으로 양자화 Level이 높을 수록(더 세밀하게 잘라서 밝기값 혹은 컬러값을 표현할수록) 원래의 영상(장면)에 가깝게 이미지가 표현되는것을 볼 수 있다. 

 

아래는 이미지 양자화의 단계별 영상을 출력하는 MATLAB 코드이다. 

 

 

+ Recent posts