관리 메뉴

ComputerVision Jack

[컴퓨터 비전 - 영상 기하학적 변환] 본문

Image Processing/Computer Vision

[컴퓨터 비전 - 영상 기하학적 변환]

JackYoon 2020. 1. 29. 14:43
반응형

어파인 변환(geometric transform)

영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾼다.

픽셀 값은 그대로 유지하면서 위치를 변경하는 작업

평행성을 보존하는 변환

영상 좌표가 이동하는 수식
수식 행렬로 변경

수학적 편의를 위해 영상의 좌표(x, y)에 가상의 좌표 1을 추가하여 (x, y, 1)형태로 바꾸면 하나의 행렬 곱으로 표시 

변환된 행렬

따라서 앞의 여섯개의 파라미터로 구성된 2 x 3행렬을 어파인 변환 행렬(affinetransformation matrix)라고 한다.

어파인 변환은 점 세개의 이동 관계만으로 정의가 가능하다.

점3개로 정의되는 어파인 변환

Mat getAffineTransform(const Point2f src[], const Point2f dst[]);

Mat getAffineTransform(InputArray src, InputArray dst);

#어파인 변환 행렬을 구하는 함수

어파인 변환을 적용할 땐, 우선 행렬을 구하고, 그 행렬을 토대로 연산을 진행한다.

 

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, 

                                          int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());

#어파인 변환 행렬을 갖고, 어파인 변환을 적용하는 함수

 

void transform(InputArray src, OutputArray dst, InputArray m);

#일부 점들이 어느 위치로 이동하는지 알고 싶을 때, 사용하는 함수

 

이동 변환

영상을 가로 또는 세로 방향으로 일정한 크기만큼 이동시키는 연산

(shift 연산)

이동 변환
이동에 관한 어파인 변환 행렬

전단변환

직사각형 형태의 영상을 한쪽 방향으로 밀어서 평행사변형 모양으로 변형되는 변환

(층 밀림 변환)

영상의 원점은 그대로 원점에 존재

전단 변환
전단에 관한 어파인 변환 행렬

크기 변환

크기 변환

 

크기에 관한 어파인 변환 행렬

void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0,

                                                                                                int interpolation = INTER_LINEAR);

#어파인 변환 행렬을 이용하여 변환하는 것 보다, resize()함수를 이용하여 크기변환이 더 빈번하다.

 

크기 변환시 영상의 블록화 현상을 방지하기 위해 보간법을 적용해야한다.

영상의 보간법 상수

회전 변환

특정 좌표를 기준으로 영상을 원하는 각도만큼 회전하는 변환

회전 변환
영상 회전 어파인 변환 행렬

Mat getRotationMatrix2D(Point2f center, double angle, double scale);

#영상을 특정 좌표 기준으로 회전시키거나 크기 변환까지 함께 수행한 어파인 변환 행렬을 얻을 수 있다.

 

void rotate(InputArray src, OutputArray dst, int rotateCode);

#영상을 90'단위로 회전하고 싶은 경우 사용 함수

 

대칭 변환

void flip(InputArray src, OutputArray dst, int flipCode);

#영상의 대칭 변환을 수행하는 함수

투시 변환(perspective transform)

어파인 변환 보다 자유도가 높은 투기 변환

영상에 대해서 직선성이 유지 되지만 평행 관계는 깨질 수 있다.

투시 변환은 네 개의 점 이동 관계에 의해 결정된다.

투시 변환 적용 사례

Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);

Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU);

#투시변환 행렬을 구하는 함수

 

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR,

                                       int borderMode = BORDER_CONSTANT, const Scalar& borderValue = Scalar());

#투시 변환 행렬을 적용하여 투시 변환을 적용시키는 함수

 

void perspectiveTransform(InputArray src, OutputArray dst, InputArray m);

#투시 변환에 의해 위치 이동을 알고 싶은 경우 사용하는 함수

투시 변환 예제

반응형
Comments