%%%% ロボットビジョン(5T) sample03a.m（画像幾何変換）  2018/6/14
%%%% 入力画像に対して画像中心を原点とした幾何変換を行い、同じ画像サイズの出力画像を表示する

clear;
% 画像の読み込み
Iin = imread('image01.bmp');
I = double(Iin);

% 画像サイズの取得
m = size(I,1); %行数
n = size(I,2); %列数

% 拡大縮小
K = [0.5,0;
     0,0.5];

% 回転
theta_deg = 30; %時計まわり方向の回転角度(deg)
theta = theta_deg * pi / 180;

R = [ cos(theta), -sin(theta);
    sin(theta), cos(theta)];

% 合成変換
A = K * R

% 合成変換行列を用いて，入力画像Iを変換し，出力画像Ipを求める
A_ = inv(A); %逆行列

for i = 1 : m
    for j = 1 : n
        p = A_(1,1)*(i-m/2) + A_(1,2)*(j-n/2) + m/2 ;
        q = A_(2,1)*(i-m/2) + A_(2,2)*(j-n/2) + n/2;
        if q > n || p > m || q < 1 || p < 1  %座標値が元画像の外側になる場合は画素値0
            Ip(i,j) = 0;
        else
            Ip(i,j) = I(round(p), round(q)); %座標値を四捨五入で整数にする（ニアレストネイバー法）
        end;
    end;
end;


% 画像の表示
figure(1);
subplot(1,2,1);
imagesc(I); colormap(gray);
subplot(1,2,2);
imagesc(Ip); colormap(gray);

%%%% EOF
