Affine geometric transformation 은 하나의 이미지 공간의 점, 선, 면의 특징을 유지한채
다른 공간으로의 선형 매핑(linear mapping)을 의미하며, 영상처리에서 흔하게 쓰이는
변환중의 하나입니다. 이미지의 확대/축소, 회전, 이동, 반사 등이 그 예입니다.
밑의 affine transformation matrix에 보듯이 입력공간을 대상으로 사용자가 지정한
변환 또는 매핑을 수행한 결과로 출력공간이 생성됩니다. 3x3 크기의 매트릭스를
affine matrix 라 부르며, 매트릭스의 값에 따라 앞서 말한 입력공간에 대한 확대/축소,
회전 등의 변환이 가능합니다.
이미지의 변환(transformation)에 중요한 역할을 하는 affine matrix 설정에 대한 설명은
Affine transformation절차 및 Scaling (이미지의 확대/축소)
Affine transformation절차를 소개하자면,
1) 변환(transformation) 목적에 따라 affine matrix를 지정하고,
2) 기하 변환 오브젝트(geometric transformation object)를 생성합니다.
3) imwarp( ) 명령어를 이용해 입력 이미지의 변환(transformation) 작업을 수행합니다.
다음 변환은 입력 이미지의 확대/축소으로써 입력 이미지의 x축으로 2배,
y축으로 3배 확대하는 예입니다.
밑의 코드에서, 1) 이미지의 확대/축소를 위한 affine matrix는 변수 T에 지정되었고,
2) 기하 변환 object는 affine2d( ) 명령어로써 생성되었으며,
3) imwarp( ) 함수의 입력 파라메터로써 앞의 1), 2)에서 생성한 affine matrix와 기하 변환 object를
이용하여 변환 결과 이미지를 생성합니다.
기하 변환 오브젝트 (geometric transformation object)는 앞서 지정한 affine matrix를
기하 변환(geometric transformation)으로써 표현하는 역할을 합니다.
밑 코드의 affine2d( )는 MATLAB 2022b 버전 부터 사용을 추천하지 않습니다. 따라서 affinetform2d( )
명령어를 사용하시기 바랍니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% scaling - enlarge 2x on x-, 3x on y-axis
T = [ 2 0 0
0 3 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
입력 이미지와 변환 결과 이미지를 하나의 figure에 담아서 scaling 변환이 두드러지지
않게 보이지만, 입력 이미지의 크기는 4,500 x 6,000 (y-axis, x-axis)이고 출력 이미지의 크기는
13,500 x 12,000 으로써 정확히 x축으로 2배, y축으로 3배 확대 되었습니다.
늘어난 이미지의 빈 공간을 채워주는 보간법(interpolation)으로써 linear type이 적용되었으며,
다른 type의 보간법(interpolation)을 지정할 수 있습니다.
Rotation (이미지의 회전)
다음은 입력 이미지의 회전 변환 입니다. 밑의 변환은 입력 이미지를 기준으로
pi/6 (= 30˚) 만큼 시계방향으로 회전하는 예입니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% rotation
T = [ cos(pi/6) sin(pi/6) 0
-sin(pi/6) cos(pi/6) 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
Flip (이미지의 반사)
다음은 입력 이미지의 반사 변환 입니다. 밑의 변환은 입력 이미지의 수직선을 기준으로
반사하는 예입니다. 즉, 입력 이미지의 좌우가 바뀌는 결과 이미지를 얻을 수 있습니다.
MATLAB의 filp( ) 함수를 이용해도 이미지의 반사(flip) 변환(transformation)을 수행할 수 있습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% flip - horizontal
T = [ -1 0 0
0 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% alternative way
% t_img2 = flip(img,2);
% figure; montage({img,t_img2});
입력 이미지의 좌, 우가 반사되었기 때문에 위의 입력, 결과 이미지는 대칭을 이루어
보입니다. 만일 입력 이미지의 수평선을 기준으로 상,하 반사를 하기 위해서는
affine matrix를 다음과 설정하면 됩니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% flip - vertical
T = [ 1 0 0
0 -1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% alternative way
% t_img2 = flip(img,1);
% figure; montage({img,t_img2});
Shear
다음은 입력 이미지의 shear 변환 입니다. 이 변환은 마치 이미지의 한 귀퉁이를
잡아 당기는 듯한 효과를 보여줍니다. 이 변환 또한 수직 또는 수평 두가지 방향으로
나뉘어 변환을 수행합니다.
밑의 예는 수평방향으로 -0.3 만큼 shear 변환하는 과정입니다. 결과 이미지는 마치
입력 이미지의 우측 상단 모서리를 잡아당긴 듯한 모습 입니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% shear - horizontal
T = [ 1 0 0
-0.3 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
같은 크기로 수직방향으로 shear 변환을 하고자 한다면 밑의 코드와
같습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% shear - vertical
T = [ 1 0.3 0
0 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
Translation (이미지의 이동)
이동(translation) 변환은 대상 이미지를 x, y방향으로 이동하는 것을 의미합니다.
다음은 입력 이미지에서 우측(x축)으로 400 픽셀, 밑(y축)으로 600 픽셀 이동(translate)
하는 예를 보이겠습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% translation - 400px on x-, 600px on y-axis
T = [ 1 0 0
0 1 0
400 600 1];
tform = affine2d(T);
[trans_img, trans_ref] = imwarp(img,tform);
figure;
subplot(1,2,1); imshow(img); axis on;
ax = gca; ax.FontSize=13; title('\fontsize{20}Input image');
subplot(1,2,2); imshow(trans_img,trans_ref);
ax = gca; ax.FontSize=13; title('\fontsize{20}Translated image');
위 오른편의 결과 이미지를 보면 변환작업이 수행되지 않은 모습이지만,
입력과 출력 이미지의 x, y좌표는 서로 다름을 볼 수 있습니다.
이것은 imwarp( ) 함수가 이미지의 이동(translation)을 포함한 전체 좌표 공간(coordinate space)이
아닌 변환된 만큼만 출력 이미지의 크기로 정하기 때문입니다.
따라서 결과의 올바른 출력을 위해 공간 참조 오브젝트(spatial referencing object)를 생성하고,
imwarp( ) 함수의 입력 파라메터로써 「‘outputView’ – 지정 값」 의 형식으로 argument를 선언합니다.
여기에서 공간 참조(spatial referencing)는 좌표 체계(coordinate system)에서 이미지의 위치정보를
정의하고, 이미지와 좌표 체계간의 관계를 구체화하는 역할을 합니다.
(MATLAB의 '공간 참조 오브젝트(spatial referencing objects)'는 다음 링크(출처 4)를 참조해 주시기 바랍니다.)
Rout = imref2d(size(img)); %create Reference2D object
tform = affine2d(T);
t_img = imwarp(img,tform,'outputView',Rout);
figure; montage({img,t_img})
공간 참조 오브젝트 imref2d( ) 를 생성후, 이미지의 이동 변환 결과,
입력 이미지가 x, y 방향으로 이동하면서 빈자리는 ‘0’ 값을 갖는 픽셀들로 채워졌고,
이미지의 크기는 변동이 없습니다.
마지막으로 본 글에 쓰인 모든 MATLAB 코드는 밑에 표시해 두었습니다.
img = imread('NCI-jdfn7Z03Qa4.jpg');
% 1) scaling - enlarge 2x on x-, 3x on y-axis
T = [ 2 0 0
0 3 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% 2) rotation
T = [ cos(pi/6) sin(pi/6) 0
-sin(pi/6) cos(pi/6) 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% 3-1) flip - horizontal
T = [ -1 0 0
0 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% alternative way
% t_img2 = flip(img,2);
% figure; montage({img,t_img2});
% 3-2) flip - vertical
T = [ 1 0 0
0 -1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% alternative way
% t_img2 = flip(img,1);
% figure; montage({img,t_img2});
% 4-1) shear - horizontal
T = [ 1 0 0
-0.3 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% 4-2) shear - vertical
T = [ 1 0.3 0
0 1 0
0 0 1];
tform = affine2d(T);
t_img = imwarp(img,tform);
figure; montage({img,t_img});
% 5) translation - 400px on x-, 600px on y-axis
% no spatial referencing objects
T = [ 1 0 0
0 1 0
400 600 1];
tform = affine2d(T);
[trans_img, trans_ref] = imwarp(img,tform);
figure;
subplot(1,2,1); imshow(img); axis on;
ax = gca; ax.FontSize=13; title('\fontsize{20}Input image');
subplot(1,2,2); imshow(trans_img,trans_ref);
ax = gca; ax.FontSize=13; title('\fontsize{20}Translated image');
% spatial referencing objects
Rout = imref2d(size(img)); %create Reference2D object
tform = affine2d(T);
t_img = imwarp(img,tform,'outputView',Rout);
figure; montage({img,t_img})
출처1: https://www.mathworks.com/discovery/affine-transformation.html
Affine Transformation
Learn how the affine transformation preserves points, straight lines, and planes. Resources include code examples, videos, and documentation covering affine transformation and other topics.
www.mathworks.com
출처2: https://learn.microsoft.com/en-us/windows/win32/direct2d/2d-affine-transform
2D affine transform effect - Win32 apps
The 2D affine transform effect applies a spatial transform to a image based on a 3X2 matrix using the Direct2D matrix transform and any of six interpolation modes.
learn.microsoft.com
출처3: https://unsplash.com/photos/jdfn7Z03Qa4
사진 작가: National Cancer Institute, Unsplash
Cells from cervical cancer – Splash에서 National Cancer Institute의 이 사진 다운로드
unsplash.com
출처4: https://www.mathworks.com/help/images/define-world-coordinates-using-spatial-referencing.html
Define World Coordinate System of Image - MATLAB & Simulink
You clicked a link that corresponds to this MATLAB command: Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
www.mathworks.com