HOWTO · MATLAB

MATLAB에서 이미지에 기하 변환을 적용하는 방법

MATLAB에서 imwarp로 이미지에 2차원 기하 변환을 적용한 다음, 출력이 보간되고 경계가 정해지는 방식을 선택하세요.

이 페이지의 내용

MATLAB의 imwarp 함수로 이미지에 기하 변환을 적용할 수 있습니다. 변환 객체를 만들거나 선택한 다음 이미지와 함께 imwarp에 전달하고, 결과 이미지의 경계를 제어하려면 출력 뷰를 선택합니다. 아래의 MATLAB 이미지 처리 예제는 구문을 보여 주기 위한 것으로 여기서 실행하지 않았습니다. 별도의 Octave 예제는 좌표 계산 결과만 보여 줍니다. 출력 경계에는 affineOutputView가 이름-값 인수 BoundsStyle를 사용합니다. BoundingStyle는 API 표기가 아닙니다.

MATLAB에서 이미지에 기하 변환 적용하기

기하 변환은 이미지 픽셀이 표시되는 위치를 바꾸며, 예를 들어 이미지를 회전, 반사, 확대·축소, 전단 또는 평행 이동할 수 있습니다. 2차원 아핀 변환에는 affine2d를 사용하며, 이 클래스는 3×3 행렬을 받습니다. MATLAB은 행 벡터 좌표를 사용하므로 마지막 행에 x와 y 방향의 평행 이동량을 지정합니다. 이에 대응하는 3차원 변환 클래스 affine3d는 4×4 행렬을 사용합니다.

기본 MATLAB 호출은 outputImage = imwarp(inputImage, transform)입니다. 입력 이미지는 숫자형, 논리형 또는 범주형일 수 있습니다.

아래 Octave 좌표 예제는 한 점을 변환한 위치를 계산합니다. MATLAB의 imwarp로 이미지 픽셀에 변환을 적용하는 예제는 아닙니다.

T = [1 0 0; 0.5 1 0; 1 0 1];
point = [2 3 1] * T;
printf('x = %.1f, y = %.1f\n', point(1), point(2));

관찰된 출력은 다음과 같습니다.

x = 4.5, y = 3.0

전체 MATLAB 예제에서는 cameraman.tif를 읽고 affine2d 변환을 만든 뒤 imwarp로 적용하고 결과를 표시합니다. MATLAB은 행 벡터 좌표를 사용하므로 이 행렬은 전단과 평행 이동을 적용합니다.

inputImage = imread('cameraman.tif'); transform = affine2d([1 0 0; 0.5 1 0; 20 10 1]); outputImage = imwarp(inputImage, transform); imshow(outputImage);

아래 그림은 affine2d로 변환한 이미지를 보여 줍니다. 게시 위치에서 이미지가 제대로 표시되는지는 확인되지 않았습니다.

Image transformed with affine2d

affine2d와 affine3d에 대한 MathWorks 문서를 참조하세요.

N도 회전

randomAffine2d와 Rotation 이름-값 인수를 사용하면 지정한 범위에서 각도를 선택하는 2차원 아핀 변환을 만들 수 있습니다. 각도를 45도로 고정하려면 [45 45]를 사용하고, [-10 10]처럼 범위를 지정하면 함수가 그 구간에서 각도를 선택합니다. 반환된 객체와 이미지를 imwarp에 전달합니다. 이 MATLAB 호출은 구문 예시이며 실행 결과가 아닙니다.

아래 그림은 설명한 이미지 회전에 해당합니다. 게시 위치에서 이미지가 제대로 표시되는지는 확인되지 않았습니다.

Image rotated using imwarp

이미지 반사, 크기 조정, 전단 및 평행 이동

randomAffine2d에서는 XReflection 또는 YReflection을 true로 설정해 반사를 만들 수도 있습니다. 크기 조정 계수에는 Scale, 전단 범위에는 XShear 또는 YShear, 평행 이동 범위에는 XTranslation 또는 YTranslation을 사용합니다. 계수가 1보다 작으면 해당 축의 크기가 줄고, 1보다 크면 커집니다. 이러한 매개변수에는 범위를 지정할 수 있으므로 양 끝값이 같으면 값이 고정됩니다. 여러 변환을 결합하기 전에 속성을 하나씩 설정해 효과를 확인할 수도 있습니다. MATLAB 호출 형식은 randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[0.1 0.1],'XTranslation',[20 20])이며, 반환된 결과를 imwarp에 적용합니다.

아래 그림은 반사, 크기 조정, 전단 및 평행 이동을 보여 줍니다. 게시 위치에서 이미지가 제대로 표시되는지는 확인되지 않았습니다.

Image with reflection, scale, shear, and translation

3차원 아핀 변환에는 이에 대응하는 변환 객체를 제공하는 randomAffine3d를 사용할 수 있습니다. 여기의 예제는 2차원 이미지에 초점을 둡니다. randomAffine3d에 대한 MathWorks 문서를 참조하세요.

출력 이미지의 가장자리, 보기 및 경계 스타일 설정

imwarp는 nearest, linear, cubic 등의 보간 방식을 지원하며 기본값은 nearest입니다. SmoothEdges는 출력 이미지 가장자리의 평활화를 제어합니다. 출력 크기는 선택한 출력 뷰와 경계에 따라 달라지므로 SmoothEdges만으로 이미지 크기가 결정되지는 않습니다.

affineOutputView(size(inputImage), transform, 'BoundsStyle', 'CenterOutput')로 출력 뷰를 만든 다음, 'OutputView', outputView를 imwarp에 전달합니다. BoundsStyle에는 CenterOutput, FollowOutput, SameAsInput을 지정할 수 있습니다. SameAsInput은 입력 이미지와 같은 크기의 뷰를 유지하고, 나머지 옵션은 변환된 이미지에 맞춰 경계를 정합니다. 관련 MATLAB 호출 형식은 outputView = affineOutputView(size(inputImage), transform, 'BoundsStyle', 'SameAsInput')이며, 이어서 outputImage = imwarp(inputImage, transform, 'SmoothEdges', true, 'OutputView', outputView)를 호출합니다. 이 호출들은 실행되지 않은 구문 예시입니다.

아래 그림은 imwarp 옵션을 적용한 출력 이미지를 보여 줍니다. 게시 위치에서 이미지가 제대로 표시되는지는 확인되지 않았습니다.

Output image with imwarp options

affineOutputView와 imwarp에 대한 MathWorks 문서를 참조하세요.