8.1.2 공간적 필터링의 구현 방법
공간적 필터링을 구현하기 위해서는 기본적으로 영상 전체를 순회하는 작업이 필요하다. 영상 내의 전체 픽셀을 순회하면서 각 픽셀 위에 마스크가 있다고 가정하고 마스크 연산을 수행해야 한다. 마스크 연산을 수행할 때, 각 픽셀에서 주변 픽셀들의 값을 참조하는 작업이 이루어지기 때문에 영상의 픽셀들을 2차원 배열 형태로 참조하는 방식이 편리하다. 앞서 6장과 7장에서 다룬 영상 처리 기법들은 모두 자기 자신의 픽셀 값만을 이용하여 결괏값을 계산할 수 있었기 때문에 IppImage 클래스의 GetPixels 멤버 함수만을 사용하였다. 그러나 공간적 필터링을 구현하기 위해서는 영상의 2차원 좌표를 더 손쉽게 접근하기 위하여 GetPixels2D 멤버 함수를 주로 사용할 것이다. GetPixels2D 함수를 이용하여 그레이스케일 영상의 픽셀 데이터에 접근하기 위해서는 다음과 같은 코드를 사용해야 한다.
IppByteImage img; // img 영상 생성... int w = img.GetWidth(); int h = img.GetHeight(); BYTE** ptr = img.GetPixels2D(); for (int j = 0; j < h; j++) for (int i = 0; i < w; i++) { // 공간적 필터링 코드 작성(마스크 연산) // (i, j) 좌표의 픽셀 값은 ptr[j][i] 형태로 참조 가능 }
위와 같이 코드를 작성하면 2중 for 루프 안에서 ptr[0][0]부터 ptr[h-1][w-1]까지의 픽셀을 차례대로 순회하게 된다. 여기서 w와 h는 영상의 가로와 세로 픽셀의 크기를 나타낸다. 2중 for 루프의 바깥쪽 루프를 구성하는 첨자 j는 y좌표에 해당하기 때문에, 위 코드에서는 영상의 맨 윗줄부터 맨 아랫줄까지, 왼쪽에서 오른쪽 순서로 방문한다. GetPixels2D 함수에 대해서는 이미 6.1절에서도 그림과 함께 설명한 바 있으니 참고하기 바란다.