【화상 처리 100개 노크에 도전】Q.28. 아핀 변환(평행 이동)

8571 단어 C++이미지 처리

사용한 라이브러리



【화상 처리 100개 노크】 독자적인 화상 입출력 클래스를 만든다
【화상 처리 100개 노크에 도전】독자적인 행렬 클래스를 만든다

Q.28. 아핀 변환(평행 이동)



아핀 변환을 이용하여 이미지를 x 방향으로 +30, y 방향으로 -30만큼 평행 이동시켜라.

이를 위해 자신의 행렬 클래스를 만들었습니다. 간단한 행렬 연산만 하면 됩니다.
int main()
{
    PPM ppm("imori.pnm");
    int width = ppm.Get_width();
    int height = ppm.Get_height();

    Matrix A(3, 3);
    A.set({
        1,0,30,
        0,1,-30,
        0,0,1
        });

    PPM ppm2(width, height);
    for(int i=0; i<width; i++)
        for (int j = 0; j < height; j++)
        {
            ppm2(i, j, 'r') = 0;
            ppm2(i, j, 'g') = 0;
            ppm2(i, j, 'b') = 0;
        }
    for(int i=0; i<width; i++)
        for (int j = 0; j < height; j++)
        {
            Matrix X(3);
            X.set({
                (double)i,
                (double)j,
                1.
                });
            Matrix X2 = A * X;
            int i2 = X2(0, 0);
            int j2 = X2(1, 0);
            if (0 <= i2 && i2 < width && 0 <= j2 && j2 < height)
            {
                ppm2(i2, j2, 'r') = ppm(i, j, 'r');
                ppm2(i2, j2, 'g') = ppm(i, j, 'g');
                ppm2(i2, j2, 'b') = ppm(i, j, 'b');
            }
        }

    ppm2.Flush("out.ppm");
    return 0;
}

좋은 웹페이지 즐겨찾기