1.2.2 2차원 배열 처리
컴퓨터에서 영상을 표현하는 가장 일반적인 방법은 C/C++의 2차원 배열array을 사용하는 방법이다. 그러므로 C/C++에서 2차원 배열을 처리하는 방법에 대하여 자세히 알아보자.
기본적으로 C/C++에서는 다차원 배열을 지원한다. 그러므로 2차원 공간에서 정의된 영상을 저장하기 위해서는 C/C++의 2차원 배열을 사용하는 것이 적합하다. 가로 크기가 640이고, 세로 크기가 480인 그레이스케일 영상 데이터를 저장할 배열을 만들려면 다음과 같은 형태로 코드를 작성해야 한다.
unsigned char a[480][640];
먼저 영상 데이터를 저장하기 위해 unsigned char 자료형을 사용한 것에 주목하자. unsigned char 자료형은 1바이트 크기를 가지며, 0부터 255까지의 정수를 저장할 수 있다. 앞서 그레이스케일 영상에서 픽셀이 가질 수 있는 값의 범위가 0부터 255라고 하였으므로 unsigned char가 픽셀을 표현하기에 가장 적합한 자료형이다. 참고로 unsigned 키워드가 없는 일반적인 char 자료형은 -128부터 127까지의 정수를 저장할 수 있다.
다음으로 2차원 배열의 크기를 지정하는 방법에 대해 알아보자. 일반적인 C/C++ 배열은 처음 선언할 때 배열의 크기를 상수constant로 지정하여 생성해야만 하며, 이처럼 크기가 처음에 고정된 배열 생성 방식을 정적 배열static array 생성이라고 한다(참고로 C/C++의 static 키워드를 사용한 정적 변수와 혼돈하지 않길 바란다). 2차원 배열을 선언할 때 두 개의 괄호([]) 중 첫 번째 괄호에 y축에 해당하는 크기를 입력하고 두 번째 괄호에 x축에 해당하는 크기를 입력한다. C/C++에서 2차원 배열을 선언하면 실제 메모리 공간에서는 2차원 배열 전체 크기만큼의 메모리 공간이 연속적으로 할당된다. 즉, 640×480=307200이므로 앞의 배열 선언이나 unsigned char a[307200]; 배열 선언이나 메모리는 동일한 크기로 연속적으로 할당된다. 다만, 2차원 배열로 선언하면 각 배열 원소에 접근할 때 2차원 배열 방식을 따르게 된다.
그림 1-12는 2차원 배열을 선언했을 때 배열의 원소를 나타내는 방법을 보여준다. 가장 첫 번째로 나타나는 배열 원소가 a[0][0]으로 표현된다. 이는 C/C++에서 배열의 인덱스index가 0-기반으로 표현되기 때문이다. 가로축으로 이동할수록 배열의 두 번째 괄호 안의 숫자가 증가하고, 세로축으로 이동할수록 배열의 첫 번째 괄호 안의 숫자가 증가한다. 배열 a의 맨 마지막 원소에 접근하기 위해서는 a[479][639]를 사용한다. 즉, 가로 크기가 w이고, 세로 크기가 h인 크기의 배열을 생성할 때, 배열 원소의 가로 인덱스 범위는 0 ~ (w-1)이고, 세로 인덱스 범위는 0 ~ (h-1)이다.