MATLAB 영상처리 기초 - 화질향상 및 공간필터링

[MATLAB 영상처리 기초 8] Affine Geometric Transformation - affine2d( ), imwarp( )

toyprojects 2023. 9. 23. 02:58

 

 

 

 

Affine Geometric Transformation 소개 동영상

 

 

 

Affine geometric transformation 은 하나의 이미지 공간의 점, 선, 면의 특징을 유지한채 

다른 공간으로의 선형 매핑(linear mapping)을 의미하며, 영상처리에서 흔하게 쓰이는

변환중의 하나입니다. 이미지의 확대/축소, 회전, 이동, 반사 등이 그 예입니다.

 

밑의 affine transformation matrix에 보듯이 입력공간을 대상으로 사용자가 지정한

변환 또는 매핑을 수행한 결과로 출력공간이 생성됩니다. 3x3 크기의 매트릭스를 

affine matrix 라 부르며, 매트릭스의 값에 따라 앞서 말한 입력공간에 대한 확대/축소,

회전 등의 변환이 가능합니다.

 

이미지의 변환(transformation) 중요한 역할을 하는 affine matrix 설정에 대한 설명은

다음 링크(출처 1)를 참고하시기 바랍니다. 

 

Affine transformation matrix (출처2)

 

 

 

 

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});

 

 

좌: 입력 이미지(출처 3), 우: x축으로 2배, y축으로 3배 scaling 결과

 

 

입력 이미지와 변환 결과 이미지를 하나의 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});

 

 

좌: 입력 이미지, 우: 시계방향으로 pi/6 rotation 결과

 

 

 

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});

 

 

좌: 입력 이미지, 우: 좌,우의 flip 결과

 

 

입력 이미지의 좌, 우가 반사되었기 때문에 위의 입력, 결과 이미지는 대칭을 이루어

보입니다. 만일 입력 이미지의 수평선을 기준으로 상,하 반사를 하기 위해서는 

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});

 

 

좌: 입력 이미지, 우: 수평방향으로 -0.3 shear 결과

 

 

 

같은 크기로 수직방향으로 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');

 

 

좌: 입력 이미지, 우: 우측으로 400픽셀, 밑으로 600픽셀 translation 결과

 

 

 

위 오른편의 결과 이미지를 보면 변환작업이 수행되지 않은 모습이지만,

입력과 출력 이미지의 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})

 

 

좌: 입력 이미지, 우: 우측으로 400픽셀, 밑으로 600픽셀 translation 결과

 

 

 

공간 참조 오브젝트 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