더북(TheBook)

그러나 실제 영상 처리 프로그래밍에서 일반적인 2차원 배열을 이용하여 영상을 표현하는 일은 거의 없다. 정적으로 생성된 배열은 배열 선언 시 배열의 크기를 상수 형태로 지정해주어야 하기 때문에 다양한 크기의 영상을 다루기에 적합하지 않다. 즉, 정적 배열을 이용하여 영상 처리를 할 경우에는 항상 지정된 크기의 영상만을 사용해야 하는 제약이 생긴다. 또 다른 문제점은 이러한 정적 배열을 지역 변수로 사용할 경우 최대 할당 가능한 배열 크기에 제약이 있다는 점이다. 일반적으로 지역 변수로 사용할 수 있는 메모리 영역에는 한계가 있기 때문에 대략 1024×1024보다 큰 배열을 만들 수 없다. 그렇기 때문에 실제 영상 처리 프로그래밍에서는 정적 배열 대신 프로그램 동작 시 배열의 크기를 결정할 수 있는 동적 배열dynamic array을 주로 사용한다.

2차원 동적 배열은 이중 포인터를 이용하여 생성한다. 가로 크기가 w이고, 세로 크기가 h인 영상을 표현하는 2차원 배열을 동적 생성하는 방법은 다음과 같다.

unsigned char** p;
p = new unsigned char*[h];
for (int i = 0; i < h; i+ +)
{
    p[i] = new unsigned char[w];
}

일단 unsigned char 포인터 타입의 메모리 공간을 h 크기만큼 동적 할당하고, 다시 w 크기만큼의 공간을 h 횟수만큼 동적 할당한다. 위와 같이 코드를 작성할 경우, p는 앞서 설명한 정적 배열과 동일한 방식으로 사용할 수 있다. 즉, 가장 첫 번째 원소는 p[0][0]으로 접근할 수 있고, 맨 마지막 배열 원소는 p[h-1][w-1] 형태로 접근할 수 있다.

그림 1-13은 위의 코드를 이용하여 동적 배열을 생성하는 과정을 보여준다. 어두운 회색의 사각형은 지역 변수를 의미하고, 밝은 회색으로 표현된 사각형은 동적 할당된 메모리 공간을 의미한다. 사각형 안에 점(•)이 그려져 있는 것은 해당 변수가 포인터형 변수임을 나타낸다. p는 이중 포인터(unsigned char**)이고, p[0]부터 p[h-1]까지는 동적 할당으로 생성된 포인터(unsigned char*) 타입의 공간이다. 포인터형 변수는 32비트 운영체제에서는 4바이트의 크기를 갖고, 64비트 운영체제에서는 8바이트의 크기를 갖는다. 실제 픽셀 값이 저장되는 데이터 공간은 unsinged char 타입이므로 각각 1바이트의 크기를 갖는다.

그림 1-13 2차원 배열 동적 생성 코드의 동작
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.