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

Ammar Ali 2024년2월15일
MATLAB에서 이미지에 기하 변환 적용

이 튜토리얼에서는 MATLAB의 imwarp() 함수를 사용하여 이미지에 기하학적 변환을 적용하는 방법에 대해 설명합니다.

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

기하학적 변환은 이미지 회전, 크기 조정 및 기울이기와 같은 요구 사항에 따라 이미지를 변환합니다. MATLAB의 imwarp() 함수를 사용하여 이미지에 기하학적 변환을 적용할 수 있습니다.

이미지는 특정 위치에 배치된 픽셀로 구성됩니다. imwrap() 함수는 주어진 변형 객체에 따라 픽셀의 위치를 변경합니다.

예를 들어 이미지를 세로로 뒤집고 싶다면 이미지에 있는 픽셀의 위치만 변경하면 됩니다. 픽셀의 맨 위 행은 주어진 이미지에 있는 픽셀의 마지막 행과 교환됩니다.

imwarp() 함수의 기본 구문은 다음과 같습니다.

output_image = imwarp(input_image, geo_tran);

위의 구문을 사용하여 주어진 기하학적 변환 geo_tran을 입력 이미지 input_image에 적용할 수 있으며 결과는 output_image에 저장됩니다. 입력 이미지는 숫자형, 논리형 또는 범주형 이미지일 수 있습니다.

MATLAB의 affine2d() 기능을 사용하여 2D 기하 변환 객체 또는 행렬을 만들 수 있습니다. affine2d() 함수 내부에 3x3 행렬을 정의하여 변환 객체를 생성하고 imwarp() 함수 내부에 전달하여 주어진 이미지에 적용해야 합니다.

예를 들어 MATLAB에 이미 저장된 카메라 이미지를 사용하고 imwarp() 함수를 사용하여 기하 변환을 적용해 보겠습니다.

아래 코드를 참조하십시오.

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = affine2d([1 0 0; .5 1 0; 1 0 1])
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

출력:

affine2d를 사용한 변환

위의 출력에서 오른쪽 이미지가 변경되고 유일한 변경 사항은 픽셀 위치임을 알 수 있습니다. 주어진 이미지와 함수에서 얻고자 하는 출력 유형에 따라 변환 행렬을 변경할 수도 있습니다.

affine2d() 기능에 대한 자세한 내용은 이 링크를 확인하십시오. 3d 이미지에 대한 기하 변환 행렬을 생성하려면 MATLAB의 affine3d() 기능을 사용할 수 있습니다.

affine3d()의 경우 입력 행렬의 크기는 4x4여야 합니다. affine3d() 기능에 대한 자세한 내용은 이 링크를 확인하십시오.

이미지를 N도 회전

이미지를 회전하려면 randomaffine2d() 함수를 사용하여 무작위 2D 아핀 변환 객체를 생성한 다음 imwarp() 함수 내에서 주어진 이미지와 함께 전달하여 주어진 이미지에 변환을 적용할 수 있습니다. randomaffine2d() 함수의 Rotation 인수를 사용할 수 있으며, 그 후 주어진 이미지를 회전시키기 위한 변환을 생성하기 위해 각도 또는 각도의 범위를 설정해야 합니다.

예를 들어 위의 이미지를 45도 회전시켜 보겠습니다. 아래 코드를 참조하십시오.

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

출력:

imwarp를 사용한 이미지 회전

위의 코드에서 동일한 값인 45를 두 번 적용했지만 범위를 제공할 수도 있으며 함수는 범위에서 임의의 각도를 선택하여 변환 개체를 만듭니다.

이미지 반사, 크기 조정, 전단 및 변환

이미지의 x축 또는 y축 반사를 생성하기 위해 XReflectionYReflection 인수를 사용할 수 있습니다. 인수 이름을 정의한 후에는 true를 전달해야 합니다. 기본적으로 이러한 인수는 false로 설정되기 때문입니다.

reflection 인수는 이미지를 가로 또는 세로로 뒤집습니다. 이미지의 한 부분을 한 방향으로 이동하고 다른 부분을 반대 방향으로 이동하는 것을 의미하는 이미지를 깎을 수도 있습니다.

또한 XShearYShear 인수를 사용하여 x 또는 y축 전단을 적용할 수 있으며 그 후에 값을 2요소 벡터로 설정해야 합니다. randomaffine2d() 함수의 scale 인수를 사용하여 이미지 크기를 조정할 수도 있습니다.

스케일 값이 1보다 작으면 이미지 크기가 줄어듭니다. 1보다 크면 증가합니다. 또한 XTranslationYTranslation 인수를 사용하여 x축 또는 y축에서 이미지를 변환할 수 있으며 그 후에 변환을 위한 2요소 행렬을 정의해야 합니다.

예를 들어 위에서 언급한 속성을 변경하고 결과를 봅시다. 아래 코드를 참조하십시오.

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[15 15],'XTranslation',[20 20]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

출력:

변환 속성 변경

각 속성을 개별적으로 변경하여 원본 이미지에서 결과를 확인할 수 있습니다. randomaffine2d() 기능에 대한 자세한 내용은 이 링크를 확인하십시오.

3D 이미지의 경우 randomaffine3d() 함수를 사용하여 3D 변형 객체를 생성할 수 있으며 randomaffine2d() 함수의 속성을 변경한 것과 같은 방식으로 해당 속성을 변경할 수 있습니다. randomaffine3d() 기능에 대한 자세한 내용은 이 링크를 확인하십시오.

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

또한 기본적으로 nearest로 설정되어 있는 보간 방법과 같은 imwarp() 함수의 속성을 변경할 수 있으며 linear 또는 cubic으로 변경할 수 있습니다. 경우에 따라 출력 이미지의 가장자리가 매끄럽지 않지만 imwarp() 함수 내부에서 SmoothEdges 인수를 사용하여 매끄러운 가장자리를 얻을 수 있습니다.

또한 OutputView 인수를 사용하여 출력 이미지의 출력 보기를 변경할 수 있으며, 그 후 affineOutputView() 함수를 사용하여 생성된 보기 개체를 전달해야 합니다. affineOutputView() 함수의 첫 번째 인수는 입력 이미지의 크기이고 두 번째 인수는 변환 개체입니다.

세 번째 선택적 인수 BoundingStyle은 출력 이미지의 경계 스타일을 설정하는 데 사용됩니다. CenterOutput, FollowOutputSameAsInput 스타일을 사용할 수 있는 세 가지 유형의 스타일이 있습니다.

예를 들어 위에서 언급한 imwarp() 함수의 속성을 변경해 봅시다. 아래 코드를 참조하십시오.

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Output_view = affineOutputView(size(Img),gform,'BoundsStyle','CenterOutput');
Jmg = imwarp(Img,gform,'SmoothEdges',true,'OutputView',Output_view);
figure
imshow(Jmg)

출력:

imwarp 속성 변경

오른쪽 이미지(출력 이미지)는 부드러운 가장자리 인수를 사용했기 때문에 입력 이미지와 크기가 같습니다. 부드러운 가장자리 인수를 사용하지 않으면 출력 이미지의 크기가 증가하며 이는 이미지 회전의 첫 번째 예에서도 볼 수 있습니다.

affineOutputView() 기능에 대한 자세한 내용은 이 링크(https://www.mathworks.com/help/images/ref/affineoutputview.html)를 확인하십시오. imwarp() 기능에 대한 자세한 내용은 이 링크(https://www.mathworks.com/help/images/ref/affineoutputview.html)를 확인하십시오.

작가: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

관련 문장 - MATLAB Image