더북(TheBook)

9.1.2 이동 변환의 구현

이 장에서 구현할 기하학적 변환 관련 함수들은 새로운 헤더 파일과 C++ 소스 파일에 작성하도록 하자. 새로 추가할 파일의 이름은 IppGeometry.h와 IppGeometry.cpp이다. Visual Studio에서 [프로젝트] > [새 항목 추가...] 메뉴를 선택하여 IppGeometry.h 파일과 IppGeometry.cpp 파일을 각각 추가하자.

이동 변환을 구현한 함수의 이름은 IppTranslate를 사용하기로 하자. 그리고 IppGeometry.h 파일에 소스 9-1과 같이 함수의 선언을 추가하자.

소스 9-1 이동 변환 함수 선언(IppGeometry.h)
#pragma once

#include "IppImage.h"

void IppTranslate(IppByteImage& imgSrc, IppByteImage& imgDst, int sx, int sy);

IppTranslate 함수는 네 개의 인자를 받는다. 첫 번째 인자 imgSrc는 이동 변환 입력 영상이며, 두 번째 인자 imgDst는 이동 변환 결과가 저장될 영상이다. 세 번째와 네 번째 인자인 sxsy는 가로와 세로 방향으로 이동할 크기를 픽셀 단위로 나타낸다. IppTranslate 함수의 전체 구현은 소스 9-2에 나타내었다.

소스 9-2 영상의 이동 변환 구현 함수(IppGeometry.cpp)
#include "stdafx.h"
#include "IppGeometry.h"

void IppTranslate(IppByteImage& imgSrc, IppByteImage& imgDst, int sx, int sy)
{
    int w = imgSrc.GetWidth();
    int h = imgSrc.GetHeight();

    imgDst.CreateImage(w, h);

    BYTE** pSrc = imgSrc.GetPixels2D();
    BYTE** pDst = imgDst.GetPixels2D();

    int i, j, x, y;
    for (j = 0; j < h; j++)
    for (i = 0; i < w; i++)
    {
        x = i - sx;
        y = j - sy;
        if (x >= 0 && x < w && y >= 0 && y < h)
        pDst[j][i] = pSrc[y][x];
    }
}

IppTranslate 함수에서는 일단 원본 영상과 동일한 크기로 imgDst 영상을 새로 만들고, 원본 영상 imgSrc의 픽셀 값을 참조하여 imgDst 영상의 픽셀 값을 설정한다. for 루프 안에서는 원본 영상에서 참조할 픽셀의 위치를 찾기 위하여 x = i - sx;y = j - sy; 문장을 사용하는 것을 볼 수 있다. xy는 입력 영상의 픽셀 좌표를 나타내고, ij는 결과 영상의 픽셀 좌표를 가리킨다. if 문에서는 원본 영상에서 참조하는 픽셀 좌표가 영상의 크기를 벗어나지 않도록 검사한다.

그림 9-2는 실제 영상에 대하여 영상의 이동 변환을 수행한 결과를 보여준다. 그림 9-2(a)는 입력 영상인 camera.bmp 파일이다. 그림 9-2(b)는 입력 영상을 (50, 50)만큼 이동한 예제이며, 그림 9-2(c)는 (-50, -50)만큼 이동한 영상이다. 영상이 이동되어 나타나는 빈 공간은 그레이스케일 값 0에 해당하는 검정색으로 채워진 것을 확인할 수 있다.

그림 9-2 실제 영상의 이동 변환 결과 예제
(a) 입력 영상
(b) (50, 50) 이동
(c) (-50, -50) 이동
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.