【화상 처리 100개 노크에 도전】Q.31. 아핀 변환(스큐)

8922 단어 C++이미지 처리

사용한 라이브러리



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

Q.31. 아핀 변환(스큐)



(1) 아핀 변환을 이용하여 출력(1)과 같은 X-sharing(dx = 30) 이미지를 생성하라.
(2) 아핀 변환을 사용하여 출력 2와 같은 Y-sharing(dy = 30) 이미지를 생성하라.
(3) 아핀 변환을 사용하여 출력 3과 같은 기하 변환 (dx = 30, dy = 30) 이미지를 만들자.

예를 들어 x 방향이라면 다음 그림과 같이 변환하는 것입니다.

(x,y) \to (ay+x,y)

같은 느낌으로 변환하면 좋은 것을 알 수 있습니다.
int main()
{
    PPM ppm("imori.pnm");
    int width = ppm.Get_width();
    int height = ppm.Get_height();

    double a = 30./(double)height;
    Matrix A(2, 2);
    A.set({
        1, a,
        0, 1
        });
    Matrix B(2, 2);
    B.set({
        1, 0,
        a, 1
        });
    Matrix C(2, 2);
    C.set({
        1, a,
        a, 1
        });

    int Width = width+30;
    int Height = height+30;
    PPM ppm2(Width, Height);
    for(int j=0; j<height; j++)
        for (int i = 0; i < width; i++)
        {
            Matrix X(2);
            X.set({
                (double)i,
                (double)j
                });
            Matrix X2 = C * 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;
}

좋은 웹페이지 즐겨찾기